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