gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:14:56 24 4
gpt4 key购买 nike

我正在尝试学习 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)
}

不幸的是,无论我如何攻击它,我似乎都陷入了变量类型冲突(缓冲区、字节数组和字符串)的噩梦。如果我能提供一些指导,以判断我是否采取了正确的方法,我将不胜感激。

最佳答案

更新为有效的东西。

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

你是对的,使用编码/二进制编写其中可能包含动态长度项( slice 和字符串)的结构有点痛苦。您可能有兴趣检查自动编码字符串的“encoding/gob”包(尽管它与您在此处获得的填充字符串不兼容)。

关于python - Golang - 打包和散列二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20922598/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com