等效于C#的ByteBuffer.wrapgetInt

问题描述

Java

byte[] input = new byte[] { 83,77,45,71,57,51,53,70 };

int buff = ByteBuffer.wrap(input).getInt();

输出1397566791

C#

byte [] array = { 83,70 };

MemoryStream stream = new MemoryStream();
using (BinaryWriter writer = new BinaryWriter(stream))
{
     writer.Write(array);
}
byte[] bytes = stream.ToArray();

int buff = BitConverter.ToInt32(bytes,0);

输出1194151251

我不知道如何获得相同输出

谢谢

解决方法

好吧,Int32仅包含4个字节,借助Take让我们Take(4)个字节。接下来,我们必须考虑 end (大或小),并在必要时Reverse4字节:

  using System.Linq;

  ... 

  byte[] array = { 83,77,45,71,57,51,53,70 };
        
  // 1397566791
  int buff = BitConverter.ToInt32(BitConverter.IsLittleEndian 
    ? array.Take(4).Reverse().ToArray()
    : array.Take(4).ToArray());
,

在Java情况下,它将按顺序获取前4个字节并将其转换为int。

System.out.println((((((83<<8)+77)<<8)+45)<<8)+71);
1397566791

在C#中,前四个字母的顺序相反。

System.out.println((((((71<<8)+45)<<8)+77)<<8)+83);
1194151251

因此,您需要阅读描述两个类的操作的API文档,并相应地使用它们。应该有一种反转字节顺序的方法。

要从C#转到Java,就应该是这样。

buff = ByteBuffer.wrap(input).order(ByteOrder.LITTLE_ENDIAN).getInt();
System.out.println(buff);

打印

1194151251