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();
}