Java整数到字节数组
我得到一个整数: 1695609641
当我使用方法:
String hex = Integer.toHexString(1695609641); system.out.println(hex);
得到:
6510f329
但我想要一个字节数组:
byte[] bytearray = new byte[] { (byte) 0x65, (byte)0x10, (byte)0xf3, (byte)0x29};
我怎样才能做到这一点?
使用Java NIO的ByteBuffer非常简单:
byte[] bytes = ByteBuffer.allocate(4).putInt(1695609641).array(); for (byte b : bytes) { System.out.format("0x%x ", b); }
输出:
0x65 0x10 0xf3 0x29
怎么样:
public static final byte[] intToByteArray(int value) { return new byte[] { (byte)(value >>> 24), (byte)(value >>> 16), (byte)(value >>> 8), (byte)value}; }
这个想法不是我的 。 我从dzone.com上的一些post中看到了它。
BigInteger.valueOf(1695609641).toByteArray()
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; }
使用番石榴 :
byte[] bytearray = Ints.toByteArray(1695609641);
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;
下面的块至less用于通过UDP发送一个int。
int到字节数组:
public byte[] intToBytes(int my_int) throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutput out = new ObjectOutputStream(bos); out.writeInt(my_int); out.close(); byte[] int_bytes = bos.toByteArray(); bos.close(); return int_bytes; }
字节数组为int:
public int bytesToInt(byte[] int_bytes) throws IOException { ByteArrayInputStream bis = new ByteArrayInputStream(int_bytes); ObjectInputStream ois = new ObjectInputStream(bis); int my_int = ois.readInt(); ois.close(); return my_int; }
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; }
org.apache.hadoop.hbase.util.Bytes类有很多方便的byte []转换方法,但是您可能不想将整个HBase jar添加到您的项目中。 令人惊讶的是,这种方法不仅缺less来自JDK的AFAIK,而且还来自像commons io这样的明显的库。
我的尝试:
public static byte[] toBytes(final int intVal, final int... intArray) { if (intArray == null || (intArray.length == 0)) { return ByteBuffer.allocate(4).putInt(intVal).array(); } else { final ByteBuffer bb = ByteBuffer.allocate(4 + (intArray.length * 4)).putInt(intVal); for (final int val : intArray) { bb.putInt(val); } return bb.array(); } }
有了它,你可以做到这一点:
byte[] fourBytes = toBytes(0x01020304); byte[] eightBytes = toBytes(0x01020304, 0x05060708);
全class在这里: https : //gist.github.com/superbob/6548493 ,它支持从短或长的初始化
byte[] eightBytesAgain = toBytes(0x0102030405060708L);
integer & 0xFF
为第一个字节
(integer >> 8) & 0xFF
对于第二个循环等,写入一个预先分配的字节数组。 有点混乱,不幸的。