Fork me on Gitee

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

  

posted @ 2021-09-16 17:58  JoePotter  阅读(873)  评论(0编辑  收藏  举报
``