2013-08-05 5 views
1

Я работаю над программой Java, в которой мне нужно преобразовать short в два байта (который затем будет упакован в пакет данных). Я использую ByteBuffer для выполнения преобразования, и, похоже, он работает, но я вижу некоторые видимые байтовые дополнения, которые я не совсем понимаю.ByteBuffer byte padding в Java

Вот простой пример, который я написал:

import java.lang.*; 
import java.io.*; 
import java.nio.ByteOrder; 
import java.nio.ByteBuffer; 

public class Test { 
    public static void main(String args[]) { 
     short i = 27015; 
     String s = Integer.toHexString(i); 

     System.out.println("i = " + i); 
     System.out.println("s = " + s); 
     System.out.println("---"); 

     ByteBuffer b = ByteBuffer.allocate(2); 
     b.order(ByteOrder.BIG_ENDIAN); 
     b.putShort(i); 

     System.out.printf("0x%H\n", b.getShort(0)); 
     System.out.println("---"); 

     byte[] a = b.array(); 

     for(int j = 0; j < a.length; j++) 
      System.out.printf("a[" + j + "] = 0x%H\n", a[j]); 

     System.exit(0); 
    } 
} 

Эта программа производит следующий вывод:

i = 27015 
s = 6987 
--- 
0x6987 
--- 
a[0] = 0x69 
a[1] = 0xFFFFFF87 

Когда ByteBuffer превращается в byte массив, почему второй байт дополняется 0xFF ? Кажется, что второй элемент массива должен быть 0x87 вместо 0xFFFFFF87. Я что-то упускаю?

Спасибо!

+0

Байт '0x87' отрицательный, имеет свой бит бит. Преобразованный в int другой получает 0xFFFFFF87, отрицательное число. –

ответ

1

Когда ByteBuffer преобразуется в массив байтов, почему второй байт дополняется 0xFF?

Когда вы печатаете %H, он выдает байт в int. Это id, а не байт в ByteBuffer, который имеет это много бит, но как он печатается. Вместо этого я предлагаю использовать Byte.toHexString(a[j]).

+0

Благодарим за то, что я смущаю свое недоумение до гораздо более сжатого вопроса и благодарю за ваш ответ. Это имеет смысл. Мне никогда не приходило в голову, что проблема была в преобразовании 'printf()'. – Dave

+0

Когда у меня сбой теста, по крайней мере 50% времени из-за чего-то не в порядке с тестом. –

0

Попробуйте вместо этого:

for (int j = 0; j < a.length; j++) 
    System.out.printf("a[" + j + "] = 0x%H\n", ((int) a[j]) & 0xFF); 

Операция & 0xFF сократит наивысшие три байта, которые создаются после преобразования в междунар.

FYI: ((int) a[j]) & 0xFF можно написать как a[j] & 0xFF и скомпилировать именно то же самое. Но я изначально написал это, чтобы уточнить, что происходит.

+0

Спасибо за предложение. Я попробовал это, и это действительно делает вывод более ясным. – Dave

Смежные вопросы