1. 程式人生 > >javaer to go之byte型別轉換

javaer to go之byte型別轉換

在Socket的Server和Client通訊的過程中,傳輸的都是位元組。而我們需要展示和使用的是字串、整形等。這個時候,我們需要對位元組進行處理,把byte型別的資料轉成我們需要的型別。

1、[]byte與16進位制字串

  • []byte轉16進位制字串
import (
    "bytes"
    "strconv"
)

//byte轉16進位制字串
func ByteToHex(data []byte) string {
    buffer := new(bytes.Buffer)
    for _, b := range data {

        s := strconv.FormatInt(int64
(b&0xff), 16) if len(s) == 1 { buffer.WriteString("0") } buffer.WriteString(s) } return buffer.String() }

因為要做字串的拼接,所以我們通過bytes工具宣告一個buffer,把strconv.FormatInt格式化單個byte的字串寫入buffer流中。

  • 16進位制字串轉[]byte
import (
    "strconv"
)

//16進位制字串轉[]byte
func HexToBye(hex string
) []byte { length := len(hex) / 2 slice := make([]byte, length) rs := []rune(hex) for i := 0; i < length; i++ { s := string(rs[i*2 : i*2+2]) value, _ := strconv.ParseInt(s, 16, 10) slice[i] = byte(value & 0xFF) } return slice }

通過把字元快速地轉成rune型別地方式形成陣列,然後在迴圈裡兩位兩位地再拼成字串。
使用strconv.ParseInt把16進位制的字串轉成10進位制的整形。
最後再把整形轉成byte放入切片中。

2、byte與unit8

很簡單,golang中byte和unit8都是8位的,直接轉換就可以。

  • byte轉unit8
i := uint8(b)
  • unit8轉byte轉
var i uint8
i = 1

b := byte(i)

3、byte[]與unit

位元組與16位、32位及64位無符號整形之前的轉換可使用”encoding/binary”包下的BigEndian(高位編址)與LittleEndian(低位編址)來操作,他們都實現了ByteOrder介面。提供了8位以上的無符號整形與byte陣列之前的轉換介面。

type ByteOrder interface {
    Uint16([]byte) uint16
    Uint32([]byte) uint32
    Uint64([]byte) uint64
    PutUint16([]byte, uint16)
    PutUint32([]byte, uint32)
    PutUint64([]byte, uint64)
    String() string
}

如我們把一個byte陣列轉成16位的無符號整形:

runningNumber := binary.BigEndian.Uint16(data[34:36])

初學者注意:

在[]byte與uint轉換的過程中,得確定[]byte的長度與型別的型別是否匹配。因為兩者的轉換是通過位移來實現的。

encoding/binary的部分原始碼:

func (bigEndian) Uint16(b []byte) uint16 { return uint16(b[1]) | uint16(b[0])<<8 }

func (bigEndian) PutUint16(b []byte, v uint16) {
    b[0] = byte(v >> 8)
    b[1] = byte(v)
}