示例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