Java将long转换为4字节

Java将long转换为4字节,java,bytearray,byte,long-integer,unsigned,Java,Bytearray,Byte,Long Integer,Unsigned,如何将长字节转换为4字节?我从一个C程序接收到一些输出,它使用无符号long。我需要读取此输出并将其转换为4字节 但是,java使用64位的有符号长。有什么方法可以进行这种转换吗?您可以编写一个循环,将“long”除以256,取其余的,然后得到“最低有效字节”。。。 (根据您想要的是小尾端还是大尾端,您可以向前或向后循环) long l=(3*256*256*256+1*256*256+4*256+8); 专用字节[]convertLongToByteArray(长l){ 字节[]b=新字节[4

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


但是,java使用64位的有符号长。有什么方法可以进行这种转换吗?

您可以编写一个循环,将“long”除以256,取其余的,然后得到“最低有效字节”。。。 (根据您想要的是小尾端还是大尾端,您可以向前或向后循环)

long l=(3*256*256*256+1*256*256+4*256+8);
专用字节[]convertLongToByteArray(长l){
字节[]b=新字节[4];
if(java.nio.ByteOrder.nativeOrder()==ByteOrder.LITTLE_ENDIAN){
对于(int i=0;i=0;i--){
b[i]=(字节)(l%256);
l=l/256;
}
}
返回b;
}

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

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

因为有符号位,所以不能。为什么不用它呢?如果这是为了优化,那么您就不必担心。
int
在Java中是32位签名的,这似乎比64位
长的
更合适。另外,您是如何将数据从C传递到Java的?如果您在C中执行
长无符号int
字节[4]
的转换,并将其(可能是逗号分隔的整数列表)传递到Java,似乎更合适。结束它吧。除非需要很长的参数,否则该方法是无用的。对于硬编码的输入,您也可以硬编码输出。@EJP来吧,作为一个例子,它看起来不错。这可能会给OP留下一些思考空间。@EJP这只是一个例子。只需声明一个变量,然后将其传递到方法中。无论如何,我更新了java中的代码长度为8字节。ByteBuffer会用8个ByteBuffer包起来。ByteBuffer会根据您的需要将它还给您。我回答这个问题是因为他说他从C程序中获取数据,这意味着字节顺序也很重要。是的,你是对的,但主要的问题是将长字节转换为4字节,这是这个解决方案无法实现的。这不是被问到的吗?如果我们所做的只是将一个long截断为int,那太容易了。只是一个简短的提示。掩码应为0x0FFFFFFFFL,以防止获取扩展符号位。@Zagrev 0x0FFFFFFFFFFL==0xFFFFFFFFL文本不是符号扩展的,它们将是您设置的值。啊!我被纠正了。在我过去的日子里,这让我受了很多次的伤害,现在这只是一种反射。那么添加&0xFFFFFFFFL;?有用吗@屏蔽
无符号int
值的mou,是。
byte[] bytes = { 1,2,3,4 };
long l = ByteBuffer.wrap(bytes)
                   .order(ByteOrder.LITTLE_ENDIAN).getInt() & 0xFFFFFFFFL;