Java字节数组并将int复制到它们中

时间:2011-12-27 00:37:01

标签: java int bytearray byte

将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中的替代方法。

由于

5 个答案:

答案 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的屏蔽以及所有这些东西。另外,如果您曾设想将双打,短裤,长号或弦乐等写入缓冲区,则无需添加所有这些方法,工作已经完成。