转义字符串文字中的十六进制值

时间:2017-04-18 00:27:02

标签: string go escaping hex

我试图在golang字符串中转义特定的十六进制值。函数调用看起来像这样:

Insert(0, "\x00\x00\x00\rIHDR\x00\x00\x000\x00\x00\x000\b\x03")
Insert(25, "\x00\x00\x00\x06PLTE")
Insert(43, "\x00\x00\x00\x02tRNS")
Insert(57, "\x00\x00\t;IDATx\xDA\x010\t\xCF\xF6") // problem line
Insert(2432, "\x00\x00\x00\x00IEND")

当语言解释“\ xDA”十六进制转义时出现问题。它不是正确地转义到Ú值,而是转义为 (替换字符)。

我确保这是以下游乐场示例中出现的内容:

fmt.Println("\xDA")
i := 218
h := fmt.Sprintf("%x", i)
fmt.Printf("Hex conf of '%d' is '%s'\n", i, h)  
fmt.Println(string(i))

此代码段在运行时会打印

�
Hex conf of '218' is 'da'
Ú

我在这里遗漏了什么吗? “\ xDA”被转义为65533的事实正在抛弃我的整个程序,它依赖于CRC32和其他一些校验和。这不会出现在这个程序的javascript version中(它本身是James compface程序的翻译,用C语言编写)。

这是游乐场链接:https://play.golang.org/p/c-XMK68maX

3 个答案:

答案 0 :(得分:4)

Go字符串只是一系列字节,但是当需要编码时,它被假定为utf8。值\xda不是有效的utf8字符,因此在打印时,它会转换为unicode.ReplacementCharacter"�"

    ReplacementChar = '\uFFFD'     // Represents invalid code points.

如果你想在字符串文字中使用\xda的符文值,请使用unicode转义:\u00DA,或使用utf8编码:\xc3\x9a,或使用字符本身:{ {1}}。

https://play.golang.org/p/EJZIqCI_Gr

如果您确实希望字符串中的单个字节值为Ú,那就是您所拥有的,并且打印的字符无关紧要。

答案 1 :(得分:1)

您的输入看起来像ISO-8859-1(Latin-1)。将其转换为UTF-8。例如,

"\x00\x00\t;IDATx\xda\x010\t\xcf\xf6"
"\x00\x00\t;IDATxÚ\x010\tÏö"

输出:

for wppath in $(find /home/*/ \( -path mail -o -path virtfs -o -path cache \) -prune -o -type f -name wp-config.php) ; do
        wppluginpath="${wppath//wp-config.php/}wp-content/plugins"
        if [ -d "$wppluginpath"/cache-enabler ] || [ -d "$wppluginpath"/comet-cache-pro ] || [ -d "$wppluginpath"/hyper-cache ] || [ -d "$wppluginpath"/quick-cache ] || [ -d "$wppluginpath"/zencache ] || [ -d "$wppluginpath"/comet-cache ] || [ -d "$wppluginpath"/wp-fastest-cache ] || [ -d "$wppluginpath"/w3-total-cache ] || [ -d "$wppluginpath"/wp-super-cache ] ; then
                echo "Found caching plugin in $wppluginpath" ; else
                echo "No caching plugin found in $wppluginpath"
                cd "$wppluginpath" || return
                wp --allow-root plugin install cache-enabler --activate --skip-plugins --skip-themes
                chown -R $(stat -c '%U' .): cache-enabler
        fi
done

答案 2 :(得分:1)

Go中的字符串是UTF-8,并且\xDA本身不是有效的UTF-8序列,这意味着将其作为字符串的一部分打印将产生Unicode替换字符U + FFFD而不是你想要的(Ú,或U + 00DA)。

然而,您似乎正在使用原始字节,因此您应该考虑是否需要由\u00DA表示的符文,其以UTF-8编码为2字节序列\xC3\x8F,或者您是否需要单字节\xDA。前者将根据需要打印Ú,需要2个字节。后者不会按预期打印,但它会正确地将\xDA解释为1个字节而不是2个字节。

以下是run on the Playground

的说明性示例
func main() {
    // A string made up of UTF-8 lead bytes.
    dataString := "\xCF\xDA\xF6"

    // Doesn't print what you think it should.
    for _, c := range dataString {
        fmt.Printf("%X ", c)
    }
    fmt.Println()

    // Convert the string's bytes to a byte slice.
    data := []byte(dataString)

    // Now it should print CF, DA, F6.
    for _, b := range data {
        fmt.Printf("%X ", b)
    }
    fmt.Println()
}