位運算實現整數與位元組陣列轉換

littlexiaoshuishui發表於2021-10-22

很多程式語言都封裝了pack(),unpack()函式,用於把各種變數轉為二進位制。比如php,python,ruby,go也有binary包來幫我們做轉化

1.binary.Write(),把變數寫入到[]byte

2.binary.Read(), 讀取[]byte轉為對應型別的變數
3.需要了解位運算,與|,左移<<,右移>>

比如封裝了[]byte轉int16, int32的函式

//PutUint16()的原理
/*
以num = 300為例,計算機載入進去記憶體後,用兩個位元組儲存 00000001 00101100(不同cup架構存放會不同,但是byte()會讀取最低位的位元組)
1.byte(),會把uint16讀取一個低位元組,所以byte(300)返回00101100,也就是44 屬於uint16的低位
2.把uint16右移8位,得到00000000 00000001,再取一個低位元組00000001,屬於uint16的高位
大端序,位元組陣列從0開始放高位到地位,所以b[0] = 1, b[1]= 44
*/
func MyPutUint16(b []byte, num uint16) {
    _ = b[1]
    b[1] = byte(num)
    b[0] = byte(num >> 8)
}
func MyPutUint32(b []byte, num uint32) {
    _ = b[3]
    b[3] = byte(num)
    b[2] = byte(num >> 8)
    b[1] = byte(num >> 16)
    b[0] = byte(num >> 24)
}

封轉了int16,int32轉[]byte

/*
以b[1,44]為例子
1.首先把每個位元組的整數轉uint16,表示用兩個位元組儲存
00000000 00000001 //b[0]
00000000 00101100 //b[1]

2. 因為是大端序,需要把高字結位b[0]移動到左邊。
00000001 00000000  //b[0]

3.使用與運算|, b[0]|b[1]得到新的uint16
00000001 00000000 b[0]
00000000 00101100 b[1]
00000001 00101100 uint16
*/
func MyUint16(b []byte) uint16 {
    _ = b[1]
    return uint16(b[1]) | uint16(b[0])<<8
}

//同理,可以得出uint32
func MyUint32(b []byte) uint32 {
    _ = b[3]
    return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3])
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結
用過哪些工具?為啥用這個工具(速度快,支援高併發...)?底層如何實現的?

相關文章