感谢您阅读我的问题。我试图在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可以选择多个答案。感谢大家回答我,祝你有愉快的一天!
Intermernet的答案向您展示了如何将十六进制字符串转换为int值。
但是你的问题似乎表明你想要获得字母'a'的代码点值,然后对该值进行aritmetics。为此,您不需要十六进制。您可以执行以下操作:
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
编辑:
使用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))
}
结果:
ZD
ParseInt解释给定基数(2到36)中的字符串s并返回相应的值i。如果base == 0,则字符串的前缀暗示基数:base 16表示“0x”,base 8表示“0”,否则表示10。
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)
}
您不希望“将字符转换为十六进制”,因为十六进制(以及十进制和二进制以及所有其他整数的基本N表示)用于向人类显示数字并将其消耗回来。计算机可以自由地以任何形式存储其操作的号码;虽然大多数(全部?)现实世界的计算机以二进制形式使用它们存储它们,但它们并非如此。
我要引导您的是,您实际上想要使用十六进制表示法(“显示形式”)将表示数字的字符转换为数字(计算机操作的数字)。为此,您可以使用已建议的strconv
包,也可以使用自己的简单转换代码。或者您可以从encoding/hex
标准包中获取一个 - 请参阅其fromHexChar
函数。
例如,
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\n", data)
cs := ASTMCheckSum(data)
fmt.Printf("%s\n", cs)
}
输出:
01081fff07
2E