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

16 進数を強制的にバイト (8 ビット) にしています。これはキャストと呼ばれ、それを行うことはできません。すべての値が適切な出力を持っていることに気付きましたexcept when 0xYZ where Y >=8 ! 。情報を失わないことが確実でない限り、キャストを使用しないでください。

于 2012-11-19T19:15:54.710 に答える
0

Rahul と irreputabe からの提案に従って、私はそれを理解しました:

UTF-16LE / ISO-8859-1 エンコーディングに変更すると、byte6 は "ffffff8a" として出力されました。次に、ここで byte から int への型変換を実行していることに気付きました。

int byte1 = b[i];

だから私はちょうど追加しました:

int byte1 = b[i] & 0xFF;

正しい結果のために。

于 2012-11-19T18:35:50.367 に答える