我试图改变ByteBuffer的地位,但没有任何影响。做错什么了?也许我的调试主要功能不正确?
@Override
public byte[] toBytes(BigDecimal type) {
int octets = getOctetsNumber();
BigInteger intVal = type.unscaledValue();
byte[] temp = intVal.toByteArray();
int addCount = octets - temp.length;
// DEBUG
ByteBuffer buffer = ByteBuffer.allocate(octets);
for(byte b: intVal.toByteArray()){
buffer.put(b);
}
if (addCount > 0){
for (; addCount > 0; addCount--) {
buffer.put((byte)0x00);
}
}
buffer.flip();
buffer.order( ByteOrder.BIG_ENDIAN);
return buffer.array();
}
public static void main(String[] arg) {
IntegerDatatype intVal = new IntegerDatatype(17);
BigDecimal bd = new BigDecimal(32000);
byte[] bytes = intVal.toBytes(bd);
String out = new String();
for (byte b : bytes) {
out += Integer.toBinaryString(b & 255 | 256).substring(1) + " ";
}
System.out.println(out);
}主函数打印此二进制字符串: 01111101 00000000 00000000 00000000,但必须打印: 00000000 101111100000000000000
发布于 2014-11-14 12:37:01
在将值放入缓冲区之前,需要更改endianness。只需在分配缓冲区大小后直接移动行,就可以了。
// DEBUG
ByteBuffer buffer = ByteBuffer.allocate(octets);
buffer.order( ByteOrder.BIG_ENDIAN);
for(byte b: intVal.toByteArray()){
buffer.put(b);
}..。
此外,endianness只会影响较大数值的字节顺序,而不会像解释的here那样影响字节。
发布于 2014-11-14 12:38:50
它应在创建缓冲区后立即设置,请参见
order.shtml
https://stackoverflow.com/questions/26930066
复制相似问题