感谢阅读我的问题。 我正在尝试计算 Golang 上的 ASTM 校验和,但无法弄清楚如何将字符串或字节转换为我自己和 Google 可计算的十六进制。 请让我请求帮助,谢谢。
在 Golang 中,如何将字符转换为允许执行求和的十六进制?
例子:
// 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 可以选择多个答案。感谢大家回答我,祝你有美好的一天!
最佳答案
Internet 的答案向您展示了如何将十六进制字符串转换为 int 值。
但是您的问题似乎表明您想获取字母“a”的代码点值,然后对该值进行算术运算。为此,您不需要十六进制。您可以执行以下操作:
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
Playground :http://play.golang.org/p/SbsUHIcrXK
编辑:
使用 here 中描述的算法对字符串进行实际的 ASTM 校验和计算可以通过以下代码完成:
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\r\x033D\r\n"
//fmt.Println(data)
fmt.Println(ASTMCheckSum(data))
}
结果:
3D
Playground :http://play.golang.org/p/7cbwryZk8r
关于go - Golang 上的十六进制求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22447263/