2013-01-01 64 views
3

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

但是,java使用带符号的64位长。有没有办法做这种转换?

+0

你不能因为咬了一口。为什么不使用多久?如果这是为了优化,那么你不应该打扰。 –

+0

'int'在Java中是32位的,这看起来比64位的'long'更合适。另外,**你是如何将数据从C传递给Java的? –

+0

如果你在C语言中对'byte [4]''进行'long unsigned int'转换,并将它传递给Java(可能是逗号分隔的整数列表),那么看起来似乎更合适。 –

回答

0

你可以编码一个循环,你把“long”除以256,取其余的,然后你有“最低有效字节”...... (取决于你是想要little-endian还是big-endian你可以向前或向后循环)

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; 
    } 
+0

快来吧。除非需要很长的参数,否则该方法是无用的。对于硬编码输入,你可能会硬性输出。 – EJP

+0

@EJP来吧,它看起来并不坏。这可能会给OP带来一些思考空间。 –

+0

@EJP这只是一个例子。一个只需要声明一个变量,然后在方法中传递它。无论如何,我更新了代码 – Rahul

1

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

+0

长是8个字节的Java。 ByteBuffer会将其包装在8个字节中。 – Rahul

+2

ByteBuffer会根据您的需要将其返回给您。我回答这个是因为他说他从C程序获取数据,这意味着字节顺序也很重要。 – Zagrev

+0

是的,你是对的,但主要担心的是将长的转换为4个字节,这将不会被这个解决方案实现 – Rahul

8

要读取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位值的范围。

+0

只是一个简短的说明。掩码应该是0x0FFFFFFFFL以防止获得扩展符号位。 – Zagrev

+0

@Zagrev 0x0FFFFFFFFL == 0xFFFFFFFFL文字不符号扩展,它们将是您设置的值。 –

+0

啊!我立场纠正。在我过去的这段时间里这么多次,现在只是一种反射。 – Zagrev