Java整数到字节数组

ste*_*fan 178 java arrays byte integer

我得到一个整数: 1695609641

当我使用方法时:

String hex = Integer.toHexString(1695609641);
system.out.println(hex); 
Run Code Online (Sandbox Code Playgroud)

得到:

6510f329
Run Code Online (Sandbox Code Playgroud)

但我想要一个字节数组:

byte[] bytearray = new byte[] { (byte) 0x65, (byte)0x10, (byte)0xf3, (byte)0x29};
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

dfa*_*dfa 281

使用Java NIO的ByteBuffer非常简单:

byte[] bytes = ByteBuffer.allocate(4).putInt(1695609641).array();

for (byte b : bytes) {
   System.out.format("0x%x ", b);
}
Run Code Online (Sandbox Code Playgroud)

输出:

0x65 0x10 0xf3 0x29 

  • 您可以使用Integer.SIZE/8来避免对4进行硬编码,这种模式适用于其他类型的Long. (12认同)
  • @rkosegi甚至自Java 8以来的Integer.BYTES :) (10认同)
  • 或者使用格式""0x%02X"`如果你总是想要两个十六进制字符以及大写十六进制字符,例如`System.out.format("0x%02X",(byte)10)`显示"0x0A". (3认同)
  • @davenpcj您甚至可以使用Integer.SIZE/Byte.SIZE (3认同)

Grz*_*zki 141

怎么样:

public static final byte[] intToByteArray(int value) {
    return new byte[] {
            (byte)(value >>> 24),
            (byte)(value >>> 16),
            (byte)(value >>> 8),
            (byte)value};
}
Run Code Online (Sandbox Code Playgroud)

这个想法不是我的.我是从dzone.com上的一些帖子中得到的.

  • 我明白你的观点,但是对于这个特殊的任务,'my'代码比一些'魔术'ByteBuffer更具说明性和清晰度,需要检查它的作用. (44认同)
  • @Kevin - 非常苛刻 - 有很多情况下这种代码是合适的,例如在图像处理中.JDK库通常很棒,但它们不涵盖和/或未针对所有用例进行优化. (24认同)
  • 同意; 与一些简单且众所周知的字节操作相比,ByteBuffer的开销和复杂性可能不合适. (14认同)
  • 我要补充的另一点是你使用了无符号右移运算符`>>>`而不是右移运算符`>>`(http://docs.oracle.com/javase/tutorial/java/nutsandbolts /op3.html)因此签名与无符号数字的行为可能与预期不符 (5认同)
  • 这种方法似乎比提到的ByteBuffer或BigInteger方法快一点.如果您要进行大量转换,还需要考虑其他因素. (4认同)
  • +1,此解决方案也适用于J2ME,其中ByteBuffer(接受的答案)可能不可用. (3认同)
  • 注意:这是BigEndian.如果您需要LittleEndian,您必须撤消订单. (3认同)
  • -1手动编码这样的东西不是一个好主意; 这是经过适当测试和评估的JDK库的用途. (2认同)
  • @RobV由于强制转换为`(byte)`,因此移位的风格在这种情况下将无关紧要。如果每种情况下移位的位数都不是8的倍数,那么*将会*存在差异。 (2认同)

vmp*_*mpn 43

BigInteger.valueOf(1695609641).toByteArray()

  • 你有什么保证会产生一个4字节的数组? (2认同)
  • 正是MeBigFatGuy写的。BigInteger.toByteArray()的Javadoc指出:“数组将包含表示此BigInteger所需的最小字节数。” (2认同)
  • 在问题的哪里,它要求字节数组是固定长度4?根据算法,这可能是您可以利用数组长度的一部分 (2认同)
  • 这似乎为0x7f创建一个字节,为0x80创建两个字节(两个字节为:0x0 0x80). (2认同)

Yur*_*nko 25

byte[] IntToByteArray( int data ) {

byte[] result = new byte[4];

result[0] = (byte) ((data & 0xFF000000) >> 24);
result[1] = (byte) ((data & 0x00FF0000) >> 16);
result[2] = (byte) ((data & 0x0000FF00) >> 8);
result[3] = (byte) ((data & 0x000000FF) >> 0);

return result;
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*sky 21

使用番石榴:

byte[] bytearray = Ints.toByteArray(1695609641);
Run Code Online (Sandbox Code Playgroud)


Car*_*icz 7

byte[] conv = new byte[4];
conv[3] = (byte) input & 0xff;
input >>= 8;
conv[2] = (byte) input & 0xff;
input >>= 8;
conv[1] = (byte) input & 0xff;
input >>= 8;
conv[0] = (byte) input;
Run Code Online (Sandbox Code Playgroud)

  • 提取最低有效的8个字节。它还避免将输入数字的符号拖到转换后的八位字节中。 (2认同)

小智 6

public static byte[] intToBytes(int x) throws IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    DataOutputStream out = new DataOutputStream(bos);
    out.writeInt(x);
    out.close();
    byte[] int_bytes = bos.toByteArray();
    bos.close();
    return int_bytes;
}
Run Code Online (Sandbox Code Playgroud)