例如,我想将 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而不是所有字节。
最佳答案
如果您在调试器中查看 asciiString
变量,您将看到所有 3 个字母都在那里,但在中间总是有一个 0x00
字符。
(来自 LINQPad 转储的屏幕截图)
不幸的是,这被解释为字符串结尾。所以这就是为什么您只看到第一个字节/字母。
documentation of GetBytes(char)说它返回:
An array of bytes with length 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,则这种情况总是会发生!
关于c# - Encoding.GetString() 仅返回字节数组中的第一个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56627526/