Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字节数组并将int复制到其中_Java_Int_Bytearray_Byte - Fatal编程技术网

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

Java字节数组并将int复制到其中,java,int,bytearray,byte,Java,Int,Bytearray,Byte,在byte[]数组的某个点上放置int的最佳方法是什么 假设您有一个字节数组: byte[] bytes = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; int someInt = 12355; //0x43, 0x30 我怎样才能像bytes[4]=someInt现在字节[4]将等于0x43,字节[5]将等于0x30 我习惯于使用C++的MeMCPY,不知道java中的替代品。 如果您还想将int的高0字节放入字节[],请多谢: voi

在byte[]数组的某个点上放置int的最佳方法是什么

假设您有一个字节数组:

byte[] bytes = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
int someInt = 12355; //0x43, 0x30
我怎样才能像
bytes[4]=someInt现在字节[4]将等于0x43,字节[5]将等于0x30

我习惯于使用C++的MeMCPY,不知道java中的替代品。
如果您还想将
int
的高0字节放入
字节[]
,请多谢:

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 placeBigEndian(int num , byte[] store, int where){
    for(int i = 3; i >= 0; --i){
        store[where+i] = (byte)(num & 0xFF);
        num >>= 8;
    }
}

void placeBigEndian(int num, byte[] store, int where){
    in mask = 0xFF000000, shift = 24;
    while((mask & num) == 0){
        mask >>>= 8;
        shift -= 8;
    }
    while(shift > 0){
        store[where++] = (byte)((num & mask) >>> shift);
        mask >>>= 8;
        shift -= 8;
    }
}

注意,您假设一个大端序!x86是小端点。。。更重要的是,您的int是32位长,因此在big-endian中为0x00004330

如果这是您想要的,请使用
ByteBuffer
(默认情况下使用大端排序):


我看不出问题所在,看起来你是用自己的方式解决的:

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字节。

首先,在Java中,不需要将字节数组初始化为零。所有数组在构造时都初始化为0/false/null

其次,
int
s是有符号的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
是数组的索引。要更改endianness,请交换索引处的偏移量。

一种方法是使用DataOutputStream及其writeInt()方法,将其包装在ByteArrayOutputStream中。e、 g.(无错误处理)

public byte[]writeIntAtPositionX(int-position,int-iVal)引发IOException{
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
DataOutputStream dos=新的DataOutputStream(BAS);
//现在,前进到一个特定的地点是很尴尬的。
//大概你实际上是在整数之前写其他东西
//但是如果你真的想晋升到一个特定的职位
对于(int i=0;i

这种方法的最大优点是,编写Java的人用0xFF和其他东西解决了字节顺序和屏蔽问题。另外,如果你曾经设想过将双倍、短裤、长字符串或字符串等写入缓冲区,你就不需要添加所有的方法,工作已经完成了。

可能的副本和其他一些…实际上,C++中的MimcPy不是一个便携解决方案,因为假设你想将字节复制到数组中的“自然”中。站台的顺序…我不确定。。。负数呢?即使不需要&0xFF,我也发现符号扩展存在很多问题,我还是要添加它。:-)@MartijnCourteaux:(字节)(值&0xFF)不能给出与(字节)值不同的结果。粘贴(byte)(value&0xFF)不会给出(byte)值以外的值的int(如果找到一个;)你说的是“除8个最低位外,所有位都归零,然后只保留8个最低位”,而不是直接“给我最低的8位”。不管怎样,将要“丢弃”的24位归零是没有意义的:)我不确定,因为我知道在Java中对原语的转换并不总是那么基本。示例:
byte b=(byte)-1现在
b=0xFF
。然后当你这样做:
inti=b。现在
i=0xFFFFFFFF
,不再是b的原始值,它是
0xFF
@Martijn-courtaux:它不叫“casting”,它叫转换:)你指的是另一种转换类型:“加宽原语转换”(例如从字节到int)。但是当你在做一个“缩小原语转换”(比如从int到byte)的时候,就没有问题了,因为你实际上丢弃了除最低位以外的所有位:)@Daniel Fischer:+1,但和我对Martijn courtaux的答案所做的评论相同。。。无论如何,如果要转换为(字节),and(&0xFF)是不必要的。是的,它不是必要的,只是显式屏蔽字节感觉更干净。可能有点特殊。哎呀。我发现了一只虫子。您正在数组中按错误的顺序放置字节。最低的位应该在右边。@Martijn我遵循了这个例子,其中
字节[4]
取低位字节,
字节[5]
取高位。尽管如此,还是为其他订单添加了版本。我明白了,但我认为这是OP的一个错误,因为
memcopy
不会像他示例中显示的OP那样工作。对于基本类型??如果是这样的话,这是一个很好的放慢速度的方法!在查看JNI头时,我可以断言情况并非如此,
jint
int
+1的类型定义,用于使用现有类(ByteBuffer)而不是编写自己的代码。也许这是一个比我的DataOutputStream建议更好的答案。@EtienDemartel这是针对类数据的,这里我讨论运行时的原始整数类型time@fge在公认的答案中,还有第二部分是关于操作数的。
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;
}
bytes[ i ]   = (byte) (someInt >> 24);
bytes[ i+1 ] = (byte) (someInt >> 16);
bytes[ i+2 ] = (byte) (someInt >> 8);
bytes[ i+3 ] = (byte) (someInt);
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();  
   }