【问题标题】:How do I put an integer inside a byte array at a given location?如何将整数放入给定位置的字节数组中?
【发布时间】:2020-05-21 08:30:24
【问题描述】:

我想用给定位置的变量填充一个字节数组。

作为一个最小示例,下面的代码尝试在字节数组的位置 10 插入一个 int 变量(这将使用字节数组的字节 10、11、12 和 13)。

public class HelloWorld{

     public static void main(String []args){

       // DESTIONATION BYTE ARRAY
       byte[] myByteArray = new byte[64];

       // INTEGER
       int myInt = 542323;

       // I WANT TO PUT myInt AT POSITION 10 IN myByteArray
       // PSEUDOCODE BELOW:
       myByteArray.putInt(myInt, 10);

     }
}

我不确定我必须将 int 直接复制到更大字节数组的给定位置。

【问题讨论】:

  • 想必你希望字节序和原生的一样?
  • 据我所知Java中的字节顺序是由标准定义的?所以它不像 C 中的字节顺序取决于架构?
  • 确实如此。 Java 使用大端。但是,如果您将这些数据发送到小端设备,您可能会使用不同的字节顺序,对吧?
  • 如果我正确理解了事情是如何工作的,Java 的大端与网络端匹配,这是我的意图(我打算通过 UDP 数据包发送数据)。因此我不需要使用本地订单

标签: java arrays byte


【解决方案1】:

一种方法是使用ByteBuffer,它已经具有将 int 拆分为 4 个字节的逻辑:

byte[] array = new byte[64];

ByteBuffer buffer = ByteBuffer.allocate(4);
// buffer.order(ByteOrder.nativeOrder()); // uncomment if you want native byte order
buffer.putInt(542323);

System.arraycopy(buffer.array(), 0, array, 10, 4);
//                                         ^^
//                        change the 10 here to copy it somewhere else

当然,这会创建一个额外的字节数组和字节缓冲区对象,如果只使用位掩码就可以避免:

int x = 542323;
byte b1 = (x >> 24) & 0xff;
byte b2 = (x >> 16) & 0xff;
byte b3 = (x >> 8) & 0xff;
byte b4 = x & 0xff;

// or the other way around, depending on byte order 
array[10] = b4;
array[11] = b3;
array[12] = b2;
array[13] = b1;

【讨论】:

  • 从其他地方我得到-与此示例相关-:byte[] totalByte = ByteBuffer.allocate(4).putInt(this.total).array(); 为什么在那里使用.array() 而不是在您的示例中?
  • @M.E.我也在我的代码中使用了.array()。这是从ByteBuffer 得到byte[]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
相关资源
最近更新 更多