【问题标题】:Java convert long to 4 bytesJava 将 long 转换为 4 个字节
【发布时间】:2012-12-15 23:57:05
【问题描述】:

如何将 long 转换为 4 个字节?我正在接收来自 C 程序的一些输出,它使用无符号长。我需要读取此输出并将其转换为 4 个字节。

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

【问题讨论】:

  • 你不能因为烧焦了。为什么不长期使用?如果这是为了优化,那么你不应该为此烦恼。
  • int 在 Java 中是 32 位签名的,这似乎比 64 位 long 更合适。另外,如何将数据从 C 传递到 Java?
  • 如果您在 C 中进行 long unsigned intbyte[4] 的转换并将其(可能是逗号分隔的整数列表)传递给 Java,这似乎更合适。

标签: java bytearray byte long-integer unsigned


【解决方案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;
  }

【讨论】:

  • 放下它。该方法是无用的,除非它需要一个长参数。使用硬编码输入,您也可以硬核输出。
  • @EJP 来吧,作为一个例子看起来还不错。这可能会给 OP 留下一些思考空间。
  • @EJP 这只是一个例子。只需要声明一个变量,然后在方法中传递它。不管怎样,我更新了代码
【解决方案2】:

您可以使用 java.nio.ByteBuffer。它可以解析长字节,并为您进行字节排序。

【讨论】:

  • long 在 java 中是 8 个字节。 ByteBuffer 会将其包装成 8 个字节
  • ByteBuffer 会根据您的需要将其返回给您。我回答这个问题是因为他说他从 C 程序中获取数据,这意味着字节顺序也很重要。
  • 是的,你是对的,但主要问题是将 long 转换为 4 字节,此解决方案无法实现
  • 我读到将长转换为字节[4]。这不是被问到的吗?如果只是将 long 截断为 int,那就太容易了。
【解决方案3】:

要读取 4 个字节作为无符号 32 位值,假设它是 little endian,最简单的做法是使用 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 0x0FFFFFFFFL == 0xFFFFFFFFL 文字没有符号扩展,它们将是您设置的值。
  • 啊!我站得更正了。这在我过去曾多次咬过我,现在只是一种反射。
  • 那么添加 & 0xFFFFFFFFL; 有用吗? ??
  • @mou 用于屏蔽unsigned int 值,是的。
猜你喜欢
  • 1970-01-01
  • 2011-08-03
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
相关资源
最近更新 更多