Encoding.GetString()仅返回字节数组中的第一个字节

时间:2019-06-17 08:29:48

标签: c# .net string byte ascii

例如,我想将3个字节转换为ASCII转换

int a = random.Next(0, 100);
int b = random.Next(0, 1000);
int c = random.Next(0, 30);

byte[] byte1 = BitConverter.GetBytes(a);
byte[] byte2 = BitConverter.GetBytes(b);
byte[] byte3 = BitConverter.GetBytes(c);

byte[] bytes = byte1.Concat(byte2).Concat(byte3).ToArray();
string asciiString = Encoding.ASCII.GetString(bytes, 0, bytes.Length);
label1.Text = asciiString;

它仅显示字节1而不是所有字节。

1 个答案:

答案 0 :(得分:5)

如果您在调试器中的asciiString变量中查找,您会看到所有3个字母都在那里,但是在两者之间总是有一个0x00字符。

(来自LINQPad Dump的屏幕截图)

enter image description here

很遗憾,这被解释为字符串结尾。所以这就是为什么您只看到第一个字节/字母的原因。

documentation of GetBytes(char)说它返回:

  

长度为2的字节数组。

如果您现在从单个字符中获取字节:

byte[] byte1 = BitConverter.GetBytes('a');

您得到以下结果:

enter image description here

解决方案是仅选择非0x00的字节:

bytes = bytes.Where(x => x != 0x00).ToArray();

string asciiString = Encoding.ASCII.GetString(bytes, 0, bytes.Length);
label1.Text = asciiString;

此示例基于GetBytes的char变体。但这适用于此方法的所有其他重载。它们都返回一个数组,该数组可以保存相应数据类型的最大值。因此,如果值太小以至于阵列中的最后一个字节不被使用并最终变为0,则总是会发生这种情况!