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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM