例如,我想将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而不是所有字节。
答案 0 :(得分:5)
如果您在调试器中的asciiString
变量中查找,您会看到所有3个字母都在那里,但是在两者之间总是有一个0x00
字符。
(来自LINQPad Dump的屏幕截图)
很遗憾,这被解释为字符串结尾。所以这就是为什么您只看到第一个字节/字母的原因。
documentation of GetBytes(char)说它返回:
长度为2的字节数组。
如果您现在从单个字符中获取字节:
byte[] byte1 = BitConverter.GetBytes('a');
您得到以下结果:
解决方案是仅选择非0x00
的字节:
bytes = bytes.Where(x => x != 0x00).ToArray();
string asciiString = Encoding.ASCII.GetString(bytes, 0, bytes.Length);
label1.Text = asciiString;
此示例基于GetBytes的char变体。但这适用于此方法的所有其他重载。它们都返回一个数组,该数组可以保存相应数据类型的最大值。因此,如果值太小以至于阵列中的最后一个字节不被使用并最终变为0,则总是会发生这种情况!