将字节从文本框转换为字节数组再转换为字符时的怪异行为

本文关键字:转换 字节 字符 字节数 文本 数组 | 更新日期: 2023-09-27 17:58:19

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

74 00 65 00 73 00 74 00

回到一个字符串中,上面写着"test",但由于某种原因,当我单击转换按钮时,它将只显示第一个字母"t"74 00,而其他字节数组也按预期工作,整个文本都被转换了。

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

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"

注意到空'0字符了吗?在文本框中显示这样的字符串时,只显示字符串的一部分,直到显示第一个Null字符为止。

由于您说结果应该是"test",所以输入实际上不是用ASCII编码的,而是用UTF-16LE(Encoding.Unicode)编码的

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

您将unicode字符串转换为ascii,您没有在机器上指定要转换的代码页。System.Text.Encoding.GetEncoding("codepage").GetString()如果我没有记错的话。还需要注意的是,.NET中的任何控件都是unicode。。。Sooooo。。。。你试图粘贴在文本框中的内容(如果转换不正确)可能是行尾字符。。或eof,或任何类型的控制字符。这一切都取决于你的代码页。

我尝试在VS2010中使用断点调试第一个程序。我发现

string word = enc.GetString(bArray);

输出word为"t''0e''0s''0t"。

最后一行

iResult.Text = word + Environment.NewLine;

iResult.Text简化为"t"。

所以我想,由于''0不是一个有效的转义序列,编译器忽略了它之后的所有内容。虽然可能是错误的,但请尝试删除输入字符串中所有出现的00

我不是很喜欢C#。我之所以建议这样做,是因为它看起来像C++。

它对我有效:

string outputText = "t'0e'0s'0t";
outputText = outputText.Replace("'0", " ");