转换C'的正确方法;在java中将uint32转换为int

转换C'的正确方法;在java中将uint32转换为int,java,c,binary,type-conversion,unsigned-integer,Java,C,Binary,Type Conversion,Unsigned Integer,我正在构建一个由多个组件组成的项目,这些组件使用套接字在字节数组中相互通信。问题是一个组件是用C编写的,支持无符号基元类型,而其他组件是用Java编写的,不支持无符号类型。我正在努力开发对Java中未签名类型的支持。我是Java新手。有人能告诉我从字节数组解码uint32和uint64的正确方法吗 我使用以下函数来转换int32和int64 public static int int32Converter(byte b[], int start) { return ((b[start]

我正在构建一个由多个组件组成的项目,这些组件使用套接字在字节数组中相互通信。问题是一个组件是用C编写的,支持无符号基元类型,而其他组件是用Java编写的,不支持无符号类型。我正在努力开发对Java中未签名类型的支持。我是Java新手。有人能告诉我从字节数组解码uint32和uint64的正确方法吗

我使用以下函数来转换int32和int64

public static int int32Converter(byte b[], int start) {
    return ((b[start] << 24) & 0xff000000 |(b[start + 1] << 16) & 0xff0000
            | (b[start + 2] << 8) & 0xff00 | (b[start + 3]) & 0xff);
}
public static long int64Converter(byte buf[], int start) {
    return ((buf[start] & 0xFFL) << 56) | ((buf[start + 1] & 0xFFL) << 48)
            | ((buf[start + 2] & 0xFFL) << 40)
            | ((buf[start + 3] & 0xFFL) << 32)
            | ((buf[start + 4] & 0xFFL) << 24)
            | ((buf[start + 5] & 0xFFL) << 16)
            | ((buf[start + 6] & 0xFFL) << 8)
            | ((buf[start + 7] & 0xFFL) << 0);
}
公共静态int-int32Converter(字节b[],int-start){

return((b[start]如果
uint32
的值从未超过2^31,则可以将其存储在Java int中。如果没有,则需要Java Long

对于uint64,如果值从未超过2^63,则可以使用long,否则需要BigInteger


在这两种情况下,如果要移植的算法依赖于换行(即值溢出整数并返回0),则需要添加自己的手动逻辑来处理这些情况。

此代码将把数组中的字节复制到int中。索引0(值1)处的字节是LSB。索引3(值15)是MSB:

byte[] bytes = { 1, 3, 7, 15 };
int result = 0; 
for (int i = 0 ; i < bytes.length ; i++) { 
    result |= bytes[i]<<(i*8); 
}
System.out.println(Integer.toBinaryString(result));
byte[]bytes={1,3,7,15};
int结果=0;
对于(int i=0;iunsignedits
。字节、短字符和长字符也是如此

请注意您的代码,不要费心手工编写此类内容,请使用
ByteBuffer

public static int bytesToInt(final byte[] array, final int start)
{
     final ByteBuffer buf = ByteBuffer.wrap(array); // big endian by default
     buf.position(start);
     buf.put(array);
     return buf.position(start).getInt();
}
将番石榴用于无符号整数:

public static UnsignedInteger bytesToUnsignedInt(final byte[] array, final int start)
{
         return UnsignedInteger.fromIntBits(bytesToInt(array, start);
}
然而,我怀疑
unsignedits
确实是您想要的(为了进行比较,请将它们打印出来等)