在Go中使用strconv作为负十六进制值

时间:2013-03-18 02:46:52

标签: hex go

在过去的一天左右,我一直在使用Go构建一个汇编程序,因此我可以熟悉该语言。这是我使用Go的第一个真正的程序所以我预计会出现问题,但我会一次又一次地出现一致的错误。在其他情况下,我只是想出了其他hacky修复方法,但这次我觉得我需要一个答案,所以我觉得我实际上是这样做的。

基本上,我必须解析大量的字节值。其中一些是有符号字节,因此-1 = 0xFF,依此类推。在计算标签的地址时,我需要找到它与当前地址的偏移量。以下代码是我用来获取偏移量的基本版本:

//  lbladdr holds the target label address
//  address holds current address in memory
//  label[x] holds the offset
if address > lbladdr {
    lbladdr -= address
}
label[x] = strconv.FormatInt(int64(lbladdr), 16)

这适用于正值,但是当我得到负地址(地址> lbladdr)时,我得到-2而不是获得像FE这样的值。我不明白为什么标准库会在十六进制数字上附加一个负号,而我无法在文档中找到任何关于它的内容。我看了很多其他的地方,但我似乎也找不到有同样问题的人。

我希望这只是我最终的一个简单修复。

2 个答案:

答案 0 :(得分:2)

在十六进制数字上使用负号是完全合理的。我知道在使用汇编时,通常使用实际的bitpattern来表示以十六进制表示的寄存器来表示符号。然而Go并不知道你这样做。写入的格式化函数也不支持十六进制值,因为它们位于CPU寄存器中。此外,位模式将根据寄存器大小而不同(16 vs 32 vs 64和big vs little endian)。你会把它们存放进去。所以底座不足以按照你想要的方式打印它们。您需要编写自己的格式化库,支持格式化您想要表示的注册类型。

答案 1 :(得分:2)

这是设计的:http://golang.org/src/pkg/strconv/itoa.go?s=628:668#L8

您可能需要投射到uint64:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    i := -1
    fmt.Printf("%x\n", uint64(i))
    fmt.Println(strconv.FormatUint(uint64(i), 16))
}