Java将long转换为4个字节

3

如何将长整型转换为4字节?我正在从一个C程序接收一些输出,它使用了无符号长整型。我需要读取这个输出并将其转换为4字节。

然而,Java使用的是有符号长整型,即64位。有没有办法进行这种转换?


你不能这样做是因为有符号位。为什么不直接使用long呢?如果这是为了优化,那么你就不用担心。 - Amit Deshpande
在Java中,int是带符号的32位,似乎比64位的long更合适。另外,你是如何将数据从C传递到Java的? - Alvin Wong
如果您在C语言中将long unsigned int转换为byte[4],然后将其传递给Java(可以是逗号分隔的整数列表),似乎更加合适。 - Alvin Wong
3个回答

9

如果想要以小端字节序为前提,读取4个字节作为无符号32位值,最简单的方法是使用ByteBuffer。

byte[] bytes = { 1,2,3,4 };
long l = ByteBuffer.wrap(bytes)
                   .order(ByteOrder.LITTLE_ENDIAN).getInt() & 0xFFFFFFFFL;

虽然l可以是一个有符号的64位值,但它只会在0和2^^32-1之间,这是一个无符号32位值的范围。


只是一条快速说明。掩码应该是0x0FFFFFFFFL,以防止获取扩展符号位。 - Zagrev
@Zagrev 0x0FFFFFFFFL == 0xFFFFFFFFL 字面量不会被符号扩展,它们将是您设置的值。 - Peter Lawrey
啊!我改正了。这个问题在过去困扰了我很多次,现在已经成为了一种本能反应。 - Zagrev
那么添加 & 0xFFFFFFFFL; 有用吗? - Arnaud Aliès
1
@mou 用于掩码“unsigned int”值,是的。 - Peter Lawrey

1
你可以编写一个循环,将“long”除以256,取余数,然后就得到了“Least Significant Byte”(最不重要字节)...(根据你想要的是小端还是大端,可以向前或向后循环)。
  long l = (3* 256 * 256 * 256 + 1 * 256 *256 + 4 * 256 + 8);
  private byte[] convertLongToByteArray(long l) {
      byte[] b = new byte[4];
      if(java.nio.ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN){
          for (int i=0; i<4; i++) {
            b[i] = (byte)(l % 256) ;
            l = l / 256;
          }
     }else{
          for (int i=3; i>=0; i--) {
            b[i] = (byte)(l % 256) ;
            l = l / 256;
          }
     }
      return b;
  }

别开玩笑了,除非它接受一个长参数,否则这个方法是没用的。如果使用硬编码输入,你还不如直接硬编码输出。 - user207421
@EJP 别这样,它作为一个例子看起来并不糟糕。这可以给问题提出者留下思考的空间。 - Alvin Wong
@EJP 这只是一个例子。只需要声明一个变量,然后将其传递给方法即可。无论如何,我已经更新了代码。 - Rahul

1
您可以使用java.nio.ByteBuffer。它可以解析长整型,而且会自动进行字节排序。

在Java中,long类型占用8个字节。ByteBuffer会将其包装在8个字节中。 - Rahul
2
ByteBuffer会按照你的需求返回数据。我回答这个问题是因为他说他从一个C程序中获取数据,这意味着字节顺序也很重要。 - Zagrev
是的,你说得对,但主要问题是将长整型转换为4个字节,而这个解决方案无法实现。 - Rahul
我看到有人将long转换为byte[4]。这不是要求的吗?如果你只是将long截断为int,那太容易了。 - Zagrev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接