Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ByteBuffer开关端部_Java_Endianness - Fatal编程技术网

Java ByteBuffer开关端部

Java ByteBuffer开关端部,java,endianness,Java,Endianness,我试图切换ByteBuffer的持久性,但没有效果。我做错了什么? 可能我的调试主功能不正确 @Override public byte[] toBytes(BigDecimal type) { int octets = getOctetsNumber(); BigInteger intVal = type.unscaledValue(); byte[] temp = intVal.toByteArray(); int addCount = octets - t

我试图切换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);
}
主函数打印此二进制字符串:01111000000000 00000000
但必须打印:00000000 10111110 00000000 00000000

在将值放入缓冲区之前,需要更改endianness。 只需在分配缓冲区大小后向右移动该行,就可以了

//        DEBUG
ByteBuffer buffer = ByteBuffer.allocate(octets);
buffer.order( ByteOrder.BIG_ENDIAN);
for(byte b: intVal.toByteArray()){
    buffer.put(b);
}


此外,endianness只影响较大数值的字节顺序,而不是解释的字节顺序。创建缓冲区后应立即设置,请参阅


谢谢你,迈克尔。我已经完全忘记了只有当您在缓冲区中推送多字节类型时,endianness才会生效。