将字节从文本框转换为字节数组到字符时的奇怪行为?

时间:2011-06-01 03:20:12

标签: c# .net string bytearray

我有一个文本框,我用它来转换像:

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;

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

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

我做错了什么可以产生这种行为的一些方法? 我可以尝试什么才能找出问题所在?

4 个答案:

答案 0 :(得分:9)

如果你有字节序列

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"

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

string word = enc.GetString(bArray);

输出 为“t \ 0e \ 0s \ 0t”。

最后一行

iResult.Text = word + Environment.NewLine;

iResult.Text 简单地称为“ t ”。

所以我在想,因为 \ 0 不是一个有效的转义序列,编译器会忽略它之后的所有内容。可能是错误但尝试删除输入字符串中出现的所有 00

我真的不喜欢C#。我只是建议这个,因为它看起来像C ++。

答案 3 :(得分:0)

它对我有用:

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