首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中将C的uint32转换为int的正确方法

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

Stack Overflow用户
提问于 2014-03-03 09:04:05
回答 3查看 9.5K关注 0票数 1

我正在构建一个由多个组件组成的项目,这些组件使用套接字在字节数组中相互通信。问题是,一个组件是用C编写的,支持无符号的原语类型,而其他组件是用Java编写的,不支持无符号类型。我试图在Java中开发对无符号类型的支持。我对Java很陌生。有人能告诉我从字节数组中解码uint32和uint64的正确方法吗?

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

代码语言:javascript
复制
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);
}

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-03 09:22:35

你不能完全“转换”他们。与处理无符号值最接近的是番石榴的UnsignedInteger及其实用程序类UnsignedInts。字节、空头和长也是一样的。

注意您的代码,不要手工编写这些东西,请使用ByteBuffer

代码语言:javascript
复制
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();
}

将番石榴用于未签名的int:

代码语言:javascript
复制
public static UnsignedInteger bytesToUnsignedInt(final byte[] array, final int start)
{
         return UnsignedInteger.fromIntBits(bytesToInt(array, start);
}

但是,我怀疑UnsignedInts确实是您想要的。(为了比较,打印出来等)

票数 3
EN

Stack Overflow用户

发布于 2014-03-03 09:14:59

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

代码语言:javascript
复制
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));

指纹:

1111000001110000001100000001

如果您将其更改为long并给它一个更长的字节数组,并且将Integer.toBinaryString()更改为long,那么它也会工作很长时间。

从现在开始,您不应该将您的长/int打印到屏幕上,作为常规的十进制值。当您需要与您的眼睛进行比较时,打印二进制或十六进制值;Long.toHexString(long)。

票数 1
EN

Stack Overflow用户

发布于 2014-03-03 09:09:52

如果uint32的值从未超过2^31,那么您可以将它们存储在Java中。如果不是,那么您将需要一个java Long。

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

在这两种情况下,如果您正在移植的算法依赖于包装(即值溢出整数并返回到0),那么您将需要添加自己的手动逻辑来处理这些场景。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22142475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档