Golang十六进制编码

时间:2014-05-27 14:39:55

标签: go hex

我正在尝试重新创建一个我用python编写的PKCS#5 Padding算法。

我正在努力重建的主线是这个

return data + (chr(pad_count) * pad_count).encode('utf-8')

基本上重复pad_count(1到16之间的整数),作为char,在1到16次之间。我在Go中获得类似的结果时遇到了麻烦。

例如,pad_count为11将返回字符串

\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b

我的关系是:

b := make([]byte, 2)
binary.LittleEndian.PutUint16(b, uint16(padCount))
fmt.Println("Pad: ", padCount, "Hex: ", hex.EncodeToString(b))

将返回:

Pad: 11 Hex: 0b00

这非常接近,显然我可以使用子字符串,并添加\ x自己,但有更好的方法来解决这个问题吗?此外,如果我子串,我觉得不能保证所有组合都适用。

2 个答案:

答案 0 :(得分:7)

正如James Henstridge已经提到的那样,您想要的格式(\x0b...)不是必需的,而是python表示不可打印的字符。亲眼看看:

>>> chr(3)
'\x03'

您需要做的事情在RFC2898中定义:

  

[...]填充字符串PS8-(||M|| mod 8)个八位字节组成   每个都有值8-(||M|| mod 8)。填充字符串PS将   满足以下陈述之一:

    PS = 01, if ||M|| mod 8 = 7 ;
    PS = 02 02, if ||M|| mod 8 = 6 ;
    ...
    PS = 08 08 08 08 08 08 08 08, if ||M|| mod 8 = 0.

这意味着你不需要uint16但是uint8(因为八位字节只有8位),你也不需要像python那样格式化你的字节。所以你唯一要做的就是使用bytes.Repeat

bytes.Repeat(paddingChar, paddingCount)

答案 1 :(得分:0)

func pad(input []byte, pad_count int) []byte {
    out := make([]byte, len(input) + int(pad_count))
    copy(out, input)
    for i := 0; i < pad_count; i++ {
        out[len(input) + i] = byte(pad_count)
    }
    return out
}