Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字节到字符串到字节的转换令人费解的错误_C#_String_Byte_Getstring - Fatal编程技术网

C# 字节到字符串到字节的转换令人费解的错误

C# 字节到字符串到字节的转换令人费解的错误,c#,string,byte,getstring,C#,String,Byte,Getstring,谁能帮我找出错误吗?代码如下: byte[] oriBytes = { 0xB0, 0x2D }; // oriBytes -> 0xB0, 0x2D string oriInStr = Encoding.ASCII.GetString(oriBytes); // oriInStr -> "?-" oriBytes = Encoding.ASCII.GetBytes(oriInStr); //

谁能帮我找出错误吗?代码如下:

   byte[] oriBytes = { 0xB0, 0x2D };                       // oriBytes -> 0xB0, 0x2D
   string oriInStr = Encoding.ASCII.GetString(oriBytes);   // oriInStr ->   "?-"
   oriBytes = Encoding.ASCII.GetBytes(oriInStr);           // oriBytes -> 0x3F, 0x2D

我无法恢复
0xB0
的原始字节值,
0x2D

0xB0不是有效的ASCII代码。你可以阅读:

任何大于十六进制0x7F的字节都被解码为Unicode问号(“?”)


在您的字节[]
0xB0
更改为176,而
0x2D
更改为45。从只有128个字符的ASCII转换过来时,176会给你什么?(未定义)和45给出-


试着调试代码,看看发生了什么。

这是因为.NET显然是一个错误。高于127的每个值都将产生
,即
63

因此,将
转换回将导致
63

当使用UTF8编码运行代码时,您将看到它进入扩展页面,因为本示例中的
newBytes
返回4个字节,而不是2个:

byte[] oriBytes = { 0xB0, 0x2D };
string oriInStr = Encoding.UTF8.GetString(oriBytes);
byte[] newBytes = Encoding.UTF8.GetBytes(oriInStr);

啊哈。。我得到了它!使用
Encoding.Unicode
代替ASCII。小心伙计们…;)


正如其他人提到的那样.Net不支持扩展ascii。要解决这个问题,您应该将字节值强制转换为本质上为int的char,这样可以正确地映射它们

 byte[] oriBytes = { 0xB0, 0x2D };                      
 string oriInStr = "";
 for (int a = 0; a < oriBytes.Length; a++)
     oriInStr += (char)(oriBytes[a]);
 oriBytes = Encoding.ASCII.GetBytes(oriInStr); 
byte[]oriBytes={0xB0,0x2D};
字符串oriInStr=“”;
for(int a=0;a
为什么要使用ASCII码进行解码?您的输入是否仅限于ASCII?使用
编码。默认值为
,这将实现OSI中使用的代码页,您刚刚解决了它。只需使用Encoding.Unicode而不是ASCII。我使用我的电子硬件ARM和PIC的每一个字节。只要确保你在解码时知道输入编码,否则你会出现类似的错误。如果你真的不想用ascii表示字符串,这是可行的。我用一个很长的字符串(文本)测试了它,事实上复制了半页。将其转换为字节数组,然后再转换回字符串。我可以得到原文。。。小心这个简单的错误。它会导致严重的头痛,至少对我来说…;)你测试过你的代码吗?它给出了非常相同的结果!0x3F,0x2Di是的你怎么打印出来的?
 byte[] oriBytes = { 0xB0, 0x2D };                      
 string oriInStr = "";
 for (int a = 0; a < oriBytes.Length; a++)
     oriInStr += (char)(oriBytes[a]);
 oriBytes = Encoding.ASCII.GetBytes(oriInStr);