3

我有一些测试代码没有按预期工作,在查看了各种站点和规范之后,我仍然无法弄清楚发生了什么。

这是我的测试代码:

byte[] b = new byte[8];
b[0] = (byte)0x72;
b[1] = (byte)0x3A;
b[2] = (byte)0x60;
b[3] = (byte)0x01;
b[4] = (byte)0x0E;
b[5] = (byte)0x10;
b[6] = (byte)0x8A;
b[7] = (byte)0x11;
String bitmapStr = new String(b);
try {
    b = bitmapStr.getBytes("US-ASCII");
} catch (Exception ex) {
    ex.printStackTrace();
}
System.out.println("DEBUG: bitmapStr = \"" +bitmapStr + "\"");
for (int i=0; i<=7; i++) {
    int byte1 = b[i];
    System.out.println("byte"+i + ": " + Integer.toHexString(byte1));
}

当我运行程序时,我在控制台输出中得到以下信息:

DEBUG: bitmapStr = "r:`�"
byte0: 72
byte1: 3a
byte2: 60
byte3: 1
byte4: e
byte5: 10
byte6: 3f
byte7: 11

看看我的字节数组中的 byte6 即 b[6] 如何输出 0x3F,但它应该是 0x8A。

任何想法为什么?

顺便说一句,如果我使用 UTF-8 编码,我会得到更时髦的输出(尽管 ASCII 是正确的)。

UTF-8 字符串编码输出:

byte0: 72
byte1: 3a
byte2: 60
byte3: 1
byte4: e
byte5: 10
byte6: ffffffef
byte7: ffffffbf
4

4 回答 4

5

尝试另一种形式的 String 构造函数:

String bitmapStr = new String(b,"ISO-8859-1");
于 2012-11-19T18:00:55.753 回答
2

尝试像这样将字符串更改为字节:-

  String source = "2675326";
 byte[] byteArray = source.getBytes("UTF-16LE");

或将您的代码更改为:-

 String bitmapStr = new String(b,"US-ASCII");
于 2012-11-19T18:01:17.173 回答
1

您正在强制十六进制变为字节(8位)。这称为强制转换,您不能这样做。您注意到所有值都有良好的输出except when 0xYZ where Y >=8 ! ,除非您确定不会丢失信息,否则不要使用强制转换。

于 2012-11-19T19:15:54.710 回答
0

根据 Rahul 和不受欢迎的建议,我想通了:

当我更改为 UTF-16LE / ISO-8859-1 编码时,byte6 输出为:“ffffff8a”,然后我意识到我在这里执行了从 byte 到 int 的类型转换:

int byte1 = b[i];

所以我只是补充说:

int byte1 = b[i] & 0xFF;

为正确的结果。

于 2012-11-19T18:35:50.367 回答