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

标签 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而不是所有字节。

最佳答案

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

(来自 LINQPad 转储的屏幕截图)

enter image description here

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

documentation of GetBytes(char)说它返回:

An array of bytes with length 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,则这种情况总是会发生!

关于c# - Encoding.GetString() 仅返回字节数组中的第一个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56627526/

相关文章:

c# - 将实例化属性绑定(bind)到 UI

c# - 如何检查正在运行的进程是否为后台进程?

c# - 是否有可能在 .Net C# 中或使用任何 REST API 获取逻辑应用程序工作流操作名称?

c# - Task<int> 是如何变成一个 int 的?

c++ - 我的函数操作 std::string 产生了意想不到的结果

java - 我应该如何在Java中使用正则表达式和分割方法获得结果?

c# - 如何给下拉列表控件设置默认值?

C# Xelement 到字符串 - 将标签转换为 &lt 和 &gt

c# - NAudio ASIO 混音

javascript - 在javascript中将变量值转换为字符串