• JAVA实现FLOAT32 类型转换大小端转换,从(1234)到 (3412) 交换字节模式


    示例3,当写入287454020时,对应的十六进制为0x11223344, 经过使用不同数据类型转换字节序后,发送和接收顺序如下所示:

      • FLOAT32 (3412) 小端交换字节模式 33,44,11,22
      • FLOAT32 (1234) 大端模式 11,22,33,44
      • FLOAT32(2143) 大端交换字节模式 22,11,44,33
      • FLOAT32(4321) 小端模式 44,33,22,11

    1.实现【FLOAT32 (3412) 小端交换字节模式 33,44,11,22】这种模式

    实现思路

    1 2 3 4  init
    
    
    b[0] = (byte) (fbit >> 16)
    b[1] = (byte) (fbit) 
    
    b[0]= 0 0 1 2
    b[1]= 1 2 3 4
    
    
    l = b[0]
    0 0 1 2
    
    l &= 0xffff
    0 0 1 2
    
    
    
    l |= ((long) b[2] << 16)
    3 4 0 0
    0 0 1 2
    -------|
    3 4 1 3
    

      

     Java实现代码:

    //方法1:  
    //(3412) 小端交换字节模式 private float big2Little(float big){ // 把float转换为byte[] int fbit = Float.floatToIntBits(big); byte[] b = new byte[4]; b[0] = (byte) (fbit >> 16); b[1] = (byte) (fbit); int l; l = b[0]; l &= 0xff; l |= ((long) b[2] << 16); float little = Float.intBitsToFloat(l); return little; }

    //方法2:    
    private float big2Little(float big){
            
        	// 把float转换为byte[]
        	int fbit = Float.floatToIntBits(big);
    
        	int a = fbit << 16;
        	a &= 0xFFFF0000;
        	System.out.println("a:"+ a);
    
            int b = fbit >> 16;
        	b &= 0xFFFF;
            System.out.println("b:"+ b);
            
            int l;
            l = a|b;
            
            System.out.println("l:"+l);
            
            float little = Float.intBitsToFloat(l);
            return little;
        }
    

      

    注意:l &= 0xff;  实现的功能为高位清0  因为【汇编语言中的逻辑右移(SHR)是将各位依次右移指定位数,然后在左侧补0,算术右移(SAR)是将各位依次右移指定位数,然后在左侧用原符号位补齐】

    参照  :移位操作和二进制知识

     2.实现【FLOAT32(4321) 小端模式 44,33,22,11】这种模式

     实现思路:

    1 2 3 4  init
    
    
    b[0]= 0 0 0 1
    b[1]= 0 0 1 2
    b[2]= 0 1 2 3
    b[3]= 1 2 3 4
    
    l = b[0]
    0 0 0 1
    l &= 0xff
    0 0 0 1
    
    l |= ((long) b[1] << 8)
    0 1 2 0
    0 0 0 1
    -------|
    0 1 2 1
    
    l &= 0xffff
    0 0 2 1
    
    l |= ((long) b[2] << 16)
    #1 2 3 0 0
    2 3 0 0
    0 0 2 1
    -------|
    2 3 2 1
    
    l &= 0xffffff  
    0 3 2 1
    
    l |= ((long) b[3] << 24)
    4 0 0 0
    0 3 2 1
    -------|
    4 3 2 1
    

     

      Java实现代码:

    //大端(1234)转小端(4321)
    private float big2Little(float big){
        // 把float转换为byte[]
        int fbit = Float.floatToIntBits(big);
    
        byte[] b = new byte[4];
        b[0] = (byte) (fbit >> 24);
        b[1] = (byte) (fbit >> 16);
        b[2] = (byte) (fbit >> 8);
        b[3] = (byte) (fbit);
        
        int l;
        l = b[0];
        l &= 0xff;
        l |= ((long) b[1] << 8);
        l &= 0xffff;
        l |= ((long) b[2] << 16);
        l &= 0xffffff;
        l |= ((long) b[3] << 24);
        float little = Float.intBitsToFloat(l);
        return little;
    }

    二进制走读执行:

    FLOAT32 (3412)
    
    80 00 44 2c       (1234)端  
    
    2c 44 00 80       (4321)端
    
    大端转小端过程
    
    1000 0000 0000 0000 0100 0100 0010 1100  init
    
    b[0]=init>>24
    0000 0000 0000 0000 0000 0000 1000 0000
    
    b[1]=init>>16
    0000 0000 0000 0000 1000 0000 0000 0000
    
    b[2]=init>>8
    0000 0000 1000 0000 0000 0000 0100 0100
    
    b[3]=init
    1000 0000 0000 0000 0100 0100 0010 1100
    
    l = b[0]
    0000 0000 0000 0000 0000 0000 1000 0000
    
    l &= 0xff
    0000 0000 0000 0000 0000 0000 1000 0000
    0000 0000 0000 0000 0000 0000 1111 1111
    ----------------------------------------&
    0000 0000 0000 0000 0000 0000 1000 0000
    
    l |= ((long) b[1] << 8)
    
    0000 0000 1000 0000 0000 0000 0000 0000
    0000 0000 0000 0000 0000 0000 1000 0000
    ----------------------------------------|
    0000 0000 1000 0000 0000 0000 1000 0000
    
    l &= 0xffff
    
    0000 0000 1000 0000 0000 0000 1000 0000
    0000 0000 0000 0000 1111 1111 1111 1111
    ----------------------------------------&
    0000 0000 0000 0000 0000 0000 1000 0000
    
    l |= ((long) b[2] << 16)
    
    0000 0000 0100 0100 0000 0000 0000 0000
    0000 0000 0000 0000 0000 0000 1000 0000
    ----------------------------------------|
    0000 0000 0100 0100 0000 0000 1000 0000
    
    l &= 0xffffff
    
    0000 0000 0100 0100 0000 0000 1000 0000
    0000 0000 1111 1111 1111 1111 1111 1111
    ---------------------------------------&
    0000 0000 0100 0100 0000 0000 1000 0000
    
    l |= ((long) b[3] << 24)
    0010 1100 0000 0000 0000 0000 0000 0000
    0000 0000 0100 0100 0000 0000 1000 0000
    -----------------------------------------|
    0010 1100 0100 0100 0000 0000 1000 0000
    2    c    4     4   0    0   8    0
    
    
    1000 0000 0000 0000 0100 0100 0010 1100
    

      

    有任何需要沟通交流的联系QQ群:276483863 加好友备注【博客园技术交流】
  • 相关阅读:
    线性方程组迭代法
    统计学习方法——朴素贝叶斯法、先验概率、后验概率
    信息熵、相对熵(KL散度)、交叉熵、条件熵
    六级听力词组积累
    样本均值和样本方差的无偏性证明、样本方差的方差
    Python 矩阵相关
    Python 绘图
    win10、VSCode、python3数据科学库
    Python杂记
    Gradient descend 梯度下降法和归一化、python中的实现(未完善)
  • 原文地址:https://www.cnblogs.com/JoePotter/p/15294597.html
Copyright © 2020-2023  润新知