Golang 中的字节格式

Format of bytes in Golang

我遇到了以字节为单位解码签名的困难。 条件:

 signedStringForIntermediateSigningKeySignature =
length_of_sender_id || sender_id || length_of_protocol_version || protocol_version || length_of_signed_key || signed_key

“||”符号意味着连接。每个组件——sender_id、protocolVersion、signedKey——都必须采用 UTF-8 编码。 signedKey必须是intermediateSigningKey.signedKey的字符串。每个组件的字节长度是小端格式的4个字节。

输入:

signedStringForIntermediateSigningKeySignature =
\x06\x00\x00\x00 || Google || | \x04\x00\x00\x00 || ECv2 || \xb5\x00\x00\x00 || {"keyExpiration":"1542323393147","keyValue":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/1+3HBVSbdv+j7NaArdgMyoSAM43yRydzqdg1TxodSzA96Dj4Mc1EiKroxxunavVIvdxGnJeFViTzFvzFRxyCw\u003d\u003d"}

Python版本:

signed = b""
for a in args:
    signed += len(a).to_bytes(4, byteorder="little")
    signed += bytes(a, "utf-8")
return signed

输出:

b'\x06\x00\x00\x00Google\x04\x00\x00\x00ECv2\xb5\x00\x00\x00{"keyExpiration":"1542323393147","keyValue":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/1+3HBVSbdv+j7NaArdgMyoSAM43yRydzqdg1TxodSzA96Dj4Mc1EiKroxxunavVIvdxGnJeFViTzFvzFRxyCw\u003d\u003d"}'

Golang 版本:

var signed []byte
arguments := []string{SenderId, RecipientId, pv, sk}
for _, a := range arguments {
    b := make([]byte, 4)
    binary.LittleEndian.PutUint32(b, uint32(len(a)))
    signed = append(signed, b...)
    signed = append(signed, []byte(a)...)
}
return signed

输出:

[6 0 0 0 71 111 111 103 108 101 0 0 0 0 4 0 0 0 69 67 118 50 181 0 0 0 123 34 107 101 121 86 97 108 117 101 34 58 34 77 70 107 119 69 119 89 72 75 111 90 73 122 106 48 67 65 81 89 73 75 111 90 73 122 106 48 68 65 81 99 68 81 103 65 69 113 121 86 105 110 120 85 122 104 82 103 101 71 88 83 118 78 85 56 55 84 52 120 72 65 72 102 70 98 84 101 98 82 103 71 74 106 78 116 117 105 115 79 81 81 121 49 73 81 122 118 117 83 50 86 52 110 102 70 102 117 109 71 78 71 117 53 55 43 112 57 70 47 72 87 115 65 119 48 80 100 43 55 73 67 65 92 117 48 48 51 100 92 117 48 48 51 100 34 44 34 107 101 121 69 120 112 105 114 97 116 105 111 110 34 58 34 49 54 51 57 49 48 54 55 50 54 57 48 48 34 125]

我看到输出不同。 你能提示我有什么问题吗?

看来问题出在输出的查看上,两个输出的字节数相等。 如果你想像 Python 一样查看你的 signed 变量,下面的代码很有用:

signedStr := strconv.Quote(string(signed))
fmt.Println(signedStr)