将int放在byte []数组中某个特定点的最佳方法是什么?
假设你有一个字节数组:
byte[] bytes = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
int someInt = 12355; //0x43, 0x30
我怎么能像bytes[4] = someInt;
这样做,现在字节[4]将等于0x43而字节[5]将等于0x30?
我习惯于只使用memcpy和C ++,而不知道Java中的替代方法。
由于
答案 0 :(得分:4)
如果你想要放入int
的{{1}}高0字节:
byte[]
如果您只希望字节为最高非零字节:
void place(int num, byte[] store, int where){
for(int i = 0; i < 4; ++i){
store[where+i] = (byte)(num & 0xFF);
num >>= 8;
}
}
如果你想要字节big-endian(最低索引的最高字节),那么存储所有四个字节的版本非常容易,另一个稍微困难:
void place(int num, byte[] store, int where){
while(num != 0){
store[where++] = (byte)(num & 0xFF);
num >>>= 8;
}
}
答案 1 :(得分:2)
注意,你假设一个大端序! x86是小端...更重要的是,你的int是32位长,因此大端的是0x00004330。
如果这是您想要的,请使用ByteBuffer
(默认使用大端排序):
ByteBuffer buf = ByteBuffer.allocate(8);
// then use buf.putInt(yourint, index)
// buf.get(index) will read byte at index index, starting from 0
答案 2 :(得分:1)
我没有看到问题,看起来你是按照自己的方式解决的:
public static void putShort(bytes[] array, int position, short value)
{
byte leftByte = (byte) (value >>> 8);
byte rightByte = (byte) (value & 0xFF);
array[position] = leftByte;
array[position + 1] = rightByte;
}
请注意,int是4个字节,short是2个字节。
答案 3 :(得分:0)
首先,在Java中,您不需要将字节数组初始化为零。所有数组在构造时初始化为0 / false / null。
其次,int
是带符号的32位大端整数,因此12355
实际上是0x00003043
。如果要使用16位整数,请使用short
类型。
然后,要获得整数中的单个字节,您可以这样做:
bytes[ i ] = (byte) (someInt >> 24);
bytes[ i+1 ] = (byte) (someInt >> 16);
bytes[ i+2 ] = (byte) (someInt >> 8);
bytes[ i+3 ] = (byte) (someInt);
转换为字节会截断其余位,因此不需要& 0xFF
掩码。我假设i
是数组的索引。要更改字节序,请在索引处交换偏移量。
答案 4 :(得分:0)
一种方法是使用DataOutputStream和它的writeInt()方法,它包含在ByteArrayOutputStream中。例如(没有错误处理)
public byte[] writeIntAtPositionX(int position, int iVal) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
// now, advancing to a specific spot is awkward.
// presumably you are actually writing other stuff out before the integer
// but if you really want to advance to a specific position
for (int i = 0; i < position; i++)
dos.writeByte(0);
dos.writeInt(iVal);
dos.flush();
dos.close();
return baos.toByteArray();
}
这种方法的最大优点是编写Java的人发现了字节排序和使用0xFF的屏蔽以及所有这些东西。另外,如果您曾设想将双打,短裤,长号或弦乐等写入缓冲区,则无需添加所有这些方法,工作已经完成。