java byte数组转long型

本文介绍了一种在Java中将字节数组(byte[])转换为长整型(long)的方法,解决了字节流通信时因符号位处理不当导致的数据解析错误。通过与0xff进行位与操作,确保了byte值的正确转换,避免了负数问题。提供了适用于不同字节长度(1,2,4,8字节)的转换函数,并附带示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java byte数组转long型

转载地址
java下没有无符号的整形(unsigned char,unsigned short,unsigned int,unsigned long), 字节流通信时往往需要把byte[]转成对应的整形,符号位处理不当会导致数据解析失败.
不同整形对应的字节长度不一, 可以统一为long来处理.
byte占一个字节,如果不做处理直接付给int或long类型的变量,当高位为1时会导致得到不正确的值(负数), 如果与0xff(或者0xffL)做位与就可以保证得到byte本身的值.

public class Main {
    public static void main(String[] args) {
        byte[] bs1 = new byte[1];
        bs1[0] = (byte) 0xf2;
        
        byte[] bs2 = new byte[2];
        bs2[0] = (byte) 0xa2;
        bs2[1] = 0x32;
        
        byte[] bs3 = new byte[4];
        bs3[0] = (byte) 0xe2;
        bs3[1] = 0x12;
        bs3[2] = 0x22;
        bs3[3] = 0x52;
        
        byte[] bs4 = new byte[8];
        bs4[0] = (byte) 0x82;
        bs4[1] = 0x12;
        bs4[2] = 0x22;
        bs4[3] = 0x32;
        bs4[4] = 0x42;
        bs4[5] = 0x52;
        bs4[6] = 0x62;
        bs4[7] = 0x72;

        try {
            System.out.printf("value1: %016x\n", bytes2long(bs1));
            System.out.printf("value2: %016x\n", bytes2long(bs2));
            System.out.printf("value3: %016x\n", bytes2long(bs3));
            System.out.printf("value4: %016x\n", bytes2long(bs4));

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    /* (non-Java-doc)
     * @see java.lang.Object#Object()
     */
    public Main() {
        super();
    }
    
    static long bytes2long(byte[] bs)  throws Exception {
        int bytes = bs.length;
        if(bytes > 1) {
        if((bytes % 2) != 0 || bytes > 8) {
            throw new Exception("not support");
        }}
        switch(bytes) {
        case 0:
            return 0;
        case 1:
            return (long)((bs[0] & 0xff));
        case 2:
            return (long)((bs[0] & 0xff) <<8 | (bs[1] & 0xff));
        case 4:
            return (long)((bs[0] & 0xffL) <<24 | (bs[1] & 0xffL) << 16 | (bs[2] & 0xffL) <<8 | (bs[3] & 0xffL));
        case 8:
            return (long)((bs[0] & 0xffL) <<56 | (bs[1] & 0xffL) << 48 | (bs[2] & 0xffL) <<40 | (bs[3] & 0xffL)<<32 | 
                    (bs[4] & 0xffL) <<24 | (bs[5] & 0xffL) << 16 | (bs[6] & 0xffL) <<8 | (bs[7] & 0xffL));
        default:
            throw new Exception("not support");     
        }
        //return 0;
    }

}
Java中的`double[]`数组换为`byte[]`数组是一个常见的需求,尤其是在处理网络传输、文件存储等场景下。下面是具体的实现步骤: ### 方案一:通过 `ByteBuffer` 我们可以利用 Java NIO 包下的 `ByteBuffer` 类来进行这种类换。 #### 示例代码: ```java import java.nio.ByteBuffer; import java.nio.DoubleBuffer; public class DoubleToByteArrayExample { public static byte[] doubleArrayToByteArray(double[] doubles) { ByteBuffer buffer = ByteBuffer.allocate(doubles.length * 8); DoubleBuffer doubleBuffer = buffer.asDoubleBuffer(); doubleBuffer.put(doubles); return buffer.array(); // 返回字节数组 } } ``` 在这个例子中,我们首先创建了一个足够大的 `ByteBuffer` 来容纳所有的双精度浮点数,并将其视图设置成可以接收 `double` 数值的形式 (`DoubleBuffer`) ,然后放入所有来自原始 `double[]` 的元素。最后返回对应的字节表示形式。 ### 方案二:手动逐位拷贝 如果你想要更细粒度地控制换过程或者不想引入额外依赖的话,则可以选择直接遍历每一个 `double` 并使用辅助函数如 `Double.doubleToRawLongBits()` 将其化为长整成字节序列添加到结果集中。 #### 示例代码: ```java public class ManualConversion { public static byte[] convertDoublesToBytes(double[] input){ int length = input.length * 8; // 每个double占8bytes byte[] result = new byte[length]; for(int i=0;i<input.length;i++){ long lValue = Double.doubleToRawLongBits(input[i]); System.arraycopy( toByteArray(lValue), 0, result, i*8, 8); } return result; } private static byte[] toByteArray(long value){ return new byte[]{ (byte)(value >>> 56), (byte)((value >> 48) & 0xFFL), (byte)((value >> 40) & 0xFFL), (byte)((value >> 32) & 0xFFL), (byte)((value >> 24) & 0xFFL), (byte)((value >> 16) & 0xFFL), (byte)((value >> 8) & 0xFFL), (byte)( value & 0xFFL) }; } } ``` 以上就是两种从 `double[]` 到 `byte[]` 的基本换思路,在实际应用时可以根据具体情况选择最合适的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值