Code Day's Night

ichikawayのブログ

よく使うbyteやbit操作系のGo言語メモ

1バイトを2進数で 0b00000001 のように表示

fmt.Printf("%#08b\n", message) //2進数

fmt.Printf("%#X\n", message) //16進数

#で0bや0xを付ける。
08で最大8個0パディング。
bで2進数。Xで16進数

バイトの配列を定義

message := byte{ 0b11011100, 0b10011010, 0b10000000 } //2進数

message := byte{ 0xFF, 0x01, 0xAA } //16進数

バイトの文字列定義

message := byte("hello")

 バイト配列の比較

a := byte{0xFF}

b := byte{0xAA}
if bytes.Compare(a, b)

バイトバッファでBigEndianで書き込み

var buf = new(bytes.Buffer)

label := byte{0xFF, 0xAA}

binary.Write(buf, binary.BigEndian, label)

バイト配列に追記

var ret byte

ret = append(ret, byte(len(str))) //1byte

ret = append(ret, byte(str)...) //n byte

byteをuint16に変換

data := byte{0xB0, 0x1B}
val := binary.BigEndian.Uint16(data)

byteをstringに変換

string(byte{0xe3, 0x81, 0x82})

stringをbyteに変換

str := "hello"
[]byte(str)

他の型に変換

a.Body.(*dnsmessage.NSResource) //a.BodyはResource型だがそれをNSResorceにして取得

intの数字と文字列の混在byte配列、null byte

const str2 string = "\x03www\x04jp0rs\x02co\x02jp\x00\x00\x01\x00\x01"

\x03がint 3、\x00がnull byte

ビット操作

var buf = new(bytes.Buffer)
var bin byte = 0 
bin = h.QR << 7  先頭bitにシフトした1bitをあてる 
bin |= byte(h.OpCode) << (7 - 4) //先頭から5bit目を操作(h.OpCodeが4bit) 
bin |= h.AA << (7 - 5) //先頭から6bit目を操作 
bin |= h.TC << (7 - 6)//先頭から7bit目を操作
bin |= h.RD << (7 - 7) //先頭から8bit目を操作