c# - 将字节从文本框转换为字节数组再转换为字符时的奇怪行为?

标签 c# .net string arrays

我有一个文本框,可用于转换以下内容:

74 00 65 00 73 00 74 00

回到一个字符串,上面写着“test”,但出于某种原因,当我点击转换按钮时,它只会显示第一个字母“t” 74 00 和其他字节数组一样工作预期,整个文本被转换。

这是我尝试过的 2 个代码,它们产生了相同的行为,即没有正确地将整个字节数组转换回字:

byte[] bArray = ByteStrToByteArray(iSequence.Text);
ASCIIEncoding enc = new ASCIIEncoding();
string word = enc.GetString(bArray);
iResult.Text = word + Environment.NewLine;

使用函数:

private byte[] ByteStrToByteArray(string byteString)
{
    byteString = byteString.Replace(" ", string.Empty);
    byte[] buffer = new byte[byteString.Length / 2];
    for (int i = 0; i < byteString.Length; i += 2)
        buffer[i / 2] = (byte)Convert.ToByte(byteString.Substring(i, 2), 16);
    return buffer;
}

我使用的另一种方式是:

string str = iSequence.Text.Replace(" ", "");
byte[] bArray = Enumerable.Range(0, str.Length)
                            .Where(x => x % 2 == 0)
                            .Select(x => Convert.ToByte(str.Substring(x, 2), 16))
                            .ToArray();
ASCIIEncoding enc = new ASCIIEncoding();
string word = enc.GetString(bArray);
iResult.Text = word + Environment.NewLine;

尝试检查长度以查看它是否正在迭代并且它是......

我真的不知道如何调试为什么上面的字节数组会发生这种情况,但所有其他字节数组似乎都工作得很好,只有这个只输出它的第一个字母。

我是否做错了什么会导致这种行为? 我可以尝试什么来找出问题所在?

最佳答案

如果你有字节序列

var bytes = new byte[] { 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00 };

然后使用 ASCII 编码(Encoding.ASCII)将其解码为字符串,然后得到

var result = Encoding.ASCII.GetString(bytes);
// result == "\x74\x00\x65\x00\x73\x00\x74\x00" == "t\0e\0s\0t\0"

注意到 Null \0 字符了吗?当您在文本框中显示这样的字符串时,只显示字符串的第一个 Null 字符之前的部分。

既然你说结果应该是 "test",那么输入实际上不是用 ASCII 编码的,而是用 UTF-16LE ( Encoding.Unicode ) 编码的。

var result = Encoding.Unicode.GetString(bytes);
// result == "\u0074\u0065\u0073\u0074" == "test"

关于c# - 将字节从文本框转换为字节数组再转换为字符时的奇怪行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6195914/

相关文章:

c# - 如何捕获客户端的 SOAP 请求?

c# - IDictionary<K, IEnumerable/IList/ICollection<V>> 上的单一扩展方法

c# - 通过 Saxon 在 XSLT 中调用 C# 函数

android - 来自 res/values/strings.xml 的字符串未显示在我的代码中使用

php - 如何在 php 变量中转义撇号以进行选择查询

json - Golang 将字符串转换为单独的 json 值而不是列表,类似于 python 中的 json.loads

c# - 使用 Shift+F5 终止运行后返回编码 Pane 的 Visual Studio 快捷方式

c# - .net - 如何将 Windows 服务与系统托盘应用程序连接

c# - 关闭子窗体时如何刷新datagridview?

c# - PrintDocument N of N 页