4

任何人都可以帮助发现错误吗?这是代码:

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

我无法取回 , 的原始字节0xB00x2D

4

5 回答 5

8

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

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

于 2014-11-24T07:51:29.193 回答
4

那是因为 .NET显然不支持扩展 ASCII 表。每个高于 127 的值都会产生?,即63.

因此,转换?背面将导致63.

使用 UTF8 编码运行代码时,您会看到它转到扩展页面,因为newBytes在此示例中返回 4 个字节而不是 2 个:

byte[] oriBytes = { 0xB0, 0x2D };
string oriInStr = Encoding.UTF8.GetString(oriBytes);
byte[] newBytes = Encoding.UTF8.GetBytes(oriInStr);
于 2014-11-24T07:52:03.753 回答
1

在你 byte[]0xB0更改为 176 并0x2D更改为 45。当从只有 128 个字符的 ASCII 转换时,176 会给你?(未定义)和 45 给你 -。

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

于 2014-11-24T07:51:45.397 回答
0

啊哈..我明白了!使用Encoding.Unicode而不是 ASCII。当心伙计们... ;)

   byte[] oriBytes = { 0xB0, 0x2D };                         // oriBytes -> 0xB0, 0x2D
   string oriInStr = Encoding.Unicode.GetString(oriBytes);   // oriInStr ->   "?-"
   oriBytes = Encoding.Unicode.GetBytes(oriInStr);           // oriBytes -> 0xB0, 0x2D
于 2014-11-24T07:55:17.947 回答
0

正如其他人所提到的,.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); 
于 2014-11-24T07:55:23.140 回答