如何解决将字节从文本框转换为字节数组再转换为字符时出现奇怪的行为?
| 我有一个文本框,可用于转换以下内容:74 00 65 00 73 00 74 00
回到一个字符串,上面说的是“ test”,但是由于某种原因,当我单击转换按钮时,它将只显示第一个字母“ t”(1),其他字节数组按预期工作,整个文本被转换。
这是我尝试的2个代码,它们产生与未将整个字节数组正确转换回word相同的行为:
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,16))
.ToArray();
ASCIIEncoding enc = new ASCIIEncoding();
string word = enc.GetString(bArray);
iResult.Text = word + Environment.NewLine;
试图检查长度,以查看它是否在迭代,并且是否...
真的不知道如何调试上面的字节数组为什么会发生这种情况,但是所有其他字节数组似乎都正常工作,仅此字节数组仅输出它的第一个字母。
我做错了什么会导致这种行为的方式吗?
我该怎么做才能找出问题所在?
解决方法
如果您有字节序列
var bytes = new byte[] { 0x74,0x00,0x65,0x73,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\"
, 您将unicode字符串转换为ascii,而不是在计算机上指定要转换的代码页。
System.Text.Encoding.GetEncoding(\"codepage\").GetString()
如果我的记忆正确的话。还要注意,.NET中的任何控件都是unicode ... Soooooo ....您试图在文本框中粘贴的内容(如果转换正确无误)可能是行字符..或eof的结尾,或任何形式控制字符。一切都取决于您的代码页。
, 我尝试在VS2010中使用断点调试第一个程序。我发现那条线
string word = enc.GetString(bArray);
输出单词为\“ 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\",\" \");
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。