Java 长到字节数组无效

Java 长到字节数组无效,java,hex,byte,Java,Hex,Byte,我开始使用字节和十六进制来更容易地存储一些数据。这就是我目前正在做的: byte[] data = new byte[] {0x20, 0x40}; long cosmetics = 0; for(byte d : data) { cosmetics = cosmetics | d; System.out.println(d + ": " + cosmetics); } String hex = Long.toHexString(cosmetics); System.out.

我开始使用字节和十六进制来更容易地存储一些数据。这就是我目前正在做的:

byte[] data = new byte[] {0x20, 0x40};
long cosmetics = 0;

for(byte d : data) {
    cosmetics = cosmetics | d;
    System.out.println(d + ": " + cosmetics);
}

String hex = Long.toHexString(cosmetics);
System.out.println("hex: 0x" + hex);
System.out.println("from hex: " + Long.decode("0x"+hex));

byte[] bytes = longToBytes(cosmetics);
String s = "";
for(byte b : bytes)
  s += b+", ";
System.out.println("bytes: " + s);
这一切工作正常,
hex:0x60
from hex=96
,就像它应该的那样(afaik)

但是,当我尝试使用
长字节(化妆品)
将96转换回字节数组时:

它不返回我最初使用的数组,它给出:
0,0,0,0,0,0,0,96

但我想让它给我的是我最初使用的数组:

byte[] data = new byte[] {0x20, 0x40};

long有8个字节,您将字节0x20 | 0x40=0x60=96作为长度放入数组中

默认情况下,Java将字节排序为bigendian,因此最低有效字节96排在最后

另一种方法是:

public static byte[] longToBytes(long x) {
    return ByteBuffer.allocate(Long.BYTES)
            .order(ByteOrder.LITTLE_ENDIAN)
            .putLong(x)
            .array();
}
应该给

96, 0, 0, 0, 0, 0, 0, 0

经过精炼的问题后

我们无法确定96来自0x20 | 0x40,但我假设您需要单个位掩码

byte[] longToBytes(long x) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    int mask = 1;
    for (int i = 0; i < 8; ++i) {
        if ((mask & x) != 0) {
            baos.write(0xFF & (int)mask);
        }
        mask <<= 1;
    }
    return baos.toArray();
}
byte[]长字节(长x){
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
int-mask=1;
对于(int i=0;i<8;++i){
如果((掩码和x)!=0){
写入(0xFF和(int)掩码);
}

屏蔽如何调用
longToBytes(长x)
你得到的结果是逻辑,我不完全明白!!@YCF\u L更新了帖子,因为我觉得不够清楚。我只是在帖子中添加了,因为我觉得不够清楚。我想得到的是我提供的初始字节数组,而不是我得到的,这与你得到的正好相反。@Swedz抱歉误解;添加了在单个位掩码中进行拆分。请参阅als以迭代单个位。
byte[] longToBytes(long x) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    int mask = 1;
    for (int i = 0; i < 8; ++i) {
        if ((mask & x) != 0) {
            baos.write(0xFF & (int)mask);
        }
        mask <<= 1;
    }
    return baos.toArray();
}