Golang - 打包和散列二进制数据

时间:2014-01-04 15:07:06

标签: python go

我正在尝试学习Golang并拥有Python背景知识。我目前正试图了解如何将变量打包成二进制格式(带校验和)。在Python中我会使用类似的东西:

import struct
import hashlib

a = 100
b = "foo\x00\x00"  # Padded to fixed length
packet = struct.pack('<B5s', a, b)
digest = hashlib.sha256(packet).digest()
packet += digest

要在Go中执行相同的操作,我正在尝试这样的代码:

package main

import (
    "crypto/sha256"
    "fmt"
    "encoding/binary"
    "bytes"
)

type packet struct {
    a uint8
    b string
}

func main() {
    var p = packet{}
    p.a = 1
    p.b = "foo\x00\x00"
    buf := new(bytes.Buffer)
    binary.Write(buf, binary.LittleEndian, &p)
    h := sha256.New()
    h.Write(buf.String())
    fmt.Printf("% x\n", p)
}

不幸的是,无论我攻击它,我似乎陷入了冲突变量类型(缓冲区,字节数组和字符串)的噩梦。我很欣赏一些关于我是否采取正确方法的指导。

1 个答案:

答案 0 :(得分:5)

更新了可行的内容。

package main

import (
   "bytes"
   "crypto/sha256"
   "encoding/binary"
   "fmt"
)

type packet struct {
   a uint8
   b []byte
}

func main() {
   var p = packet{}
   p.a = 1
   p.b = []byte("foo\x00\x00")
   buf := bytes.Buffer{}
   err := binary.Write(&buf, binary.BigEndian, p.a)
   if err != nil {
       fmt.Println(err)
   }
   _, err = buf.Write(p.b)
   if err != nil {
       fmt.Println(err)
   }
   h := sha256.New()
   h.Write(buf.Bytes())
   hash := h.Sum([]byte{})
   fmt.Printf("% x\n", hash)
}

http://play.golang.org/p/t8ltu_WCpe

你是对的,使用编码/二进制文件编写带有可能动态长度项的结构(切片和字符串)有点痛苦。您可能有兴趣查看&#34; encoding / gob&#34;自动编码字符串的包(尽管它与你在这里填充的字符串不兼容)。