感谢您阅读我的问题。
我正在尝试在Golang上计算ASTM校验和,但无法弄清楚如何将字符串或字节转换为自己和Google可计数的十六进制。
请让我请求帮助,谢谢。
在Golang,如何将字符转换为可以执行求和的十六进制?
例:
1 2 3 4 | // Convert character"a" to hex 0x61 ( I understand this will not work for my case as it became a string.) hex := fmt.Sprintf("%x","a") // sum the 0x61 with 0x01 so it will become 0x62 ="b" fmt.Printf("%v",hex + 0x01) |
非常感谢您,祝您愉快。
感谢大家回答我的问题! peterSO和ANisus的答案都解决了我的问题。 请让我选择ANisus的答复作为答案,因为它包含ASTM特殊字符。 我希望StackOverflow可以选择多个答案。 感谢大家回答我,祝您有美好的一天!
Intermernet的答案向您展示了如何将十六进制字符串转换为int值。
但是您的问题似乎暗示您想要获取字母" a"的代码点值,然后对该值进行算术运算。为此,您不需要十六进制。您可以执行以下操作:
1 2 3 4 5 6 7 8 9 10 11 | package main import"fmt" func main() { // Get the code point value of 'a' which is 0x61 val := 'a' // sum the 0x61 with 0x01 so it will become 0x62 = 'b' fmt.Printf("%v", string(val + 0x01)) } |
结果:
b
游乐场:http://play.golang.org/p/SbsUHIcrXK
使用此处描述的算法从字符串执行实际的ASTM校验和可以通过以下代码完成:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | package main import ( "fmt" ) const ( ETX = 0x03 ETB = 23 STX = 0x02 ) func ASTMCheckSum(frame string) string { var sumOfChars uint8 //take each byte in the string and add the values for i := 0; i < len(frame) ; i++ { byteVal := frame[i] sumOfChars += byteVal if byteVal == STX { sumOfChars = 0 } if byteVal == ETX || byteVal == ETB { break } } // return as hex value in upper case return fmt.Sprintf("%02X", sumOfChars) } func main() { data :="\x025R|2|^^^1.0000+950+1.0|15|||^5^||V||34001637|20080516153540|20080516153602|34001637 \x033D " //fmt.Println(data) fmt.Println(ASTMCheckSum(data)) } |
结果:
3D
游乐场:http://play.golang.org/p/7cbwryZk8r
- 真的非常感谢您的回答!不知道使用单引号会将字符串更改为代码点。还要感谢astm的实现,包括特殊字符!真的感谢您的宝贵时间,祝您度过愉快的一天!
- 是的,单引号表示符文文字。时不时派上用场。另外,您可能会考虑添加错误检查,例如未找到任何ETX或ETB时等等。欢迎您。祝您编程愉快! :)
您可以使用
ParseInt interprets a string s in the given base (2 to 36) and returns the corresponding value i. If base == 0, the base is implied by the string's prefix: base 16 for"0x", base 8 for"0", and base 10 otherwise.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | package main import ( "fmt" "strconv" ) func main() { start :="a" result, err := strconv.ParseInt(start, 16, 0) if err != nil { panic(err) } fmt.Printf("%x", result+1) } |
操场
- 真的非常感谢您的回答!很抱歉,我的解释不清楚,实际上,我需要一个个地隐瞒诸如" hijklmn"之类的词以十六进制表示,并获得其总和。感谢您教给我有关ParseInt的知识,我可以在其他地方使用。谢谢您的时间,请度过愉快的一天!
您不希望"将字符转换为十六进制",因为十六进制(以及十进制和二进制以及所有其他以N为基数的N表示形式)在这里用于向人类显示数字并将其消费。计算机可以自由地实际存储其希望以任何形式运行的数字。虽然大多数(所有?)现实世界中的计算机都使用位以二进制形式存储它们,但它们不必这样做。
我要带您介绍的是,您实际上是想将使用十六进制表示法("显示形式")表示数字的字符转换为数字(计算机在其上操作)。为此,您可以按照建议使用
- 非常感谢您回答我的问题!感谢您将我引向正确的位置。我认为我对实际的十六进制和整数了解不甚了解或了解得如何。我将根据您提供的信息向我重新学习。非常感谢 !
例如,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package main import"fmt" func ASTMCheckSum(data []byte) []byte { cs := byte(0) for _, b := range data { cs += b } return []byte(fmt.Sprintf("%02X", cs)) } func main() { data := []byte{0x01, 0x08, 0x1f, 0xff, 0x07} fmt.Printf("%x ", data) cs := ASTMCheckSum(data) fmt.Printf("%s ", cs) } |
输出:
1 2 | 01081fff07 2E |
- 真的非常感谢您的回答!这完全解决了我的问题!一整天都在努力解决,但我自己解决不了。真的非常感谢!