在Golang中对十六进制求和

3
感谢阅读我的问题。 我正在尝试在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)

非常感谢,祝你有美好的一天。

感谢每个回答我的问题的人!peterSOANisus 的回答都解决了我的问题。请让我选择 ANisus 的回复作为答案,因为它包含了 ASTM 特殊字符。我希望 StackOverflow 能够选择多个答案。感谢所有回答我的人,祝你们有美好的一天!

4个回答

2

Intermernet 的回答告诉你如何将十六进制字符串转换为整数值。

但是你的问题似乎暗示你想要获取字母 '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

编辑:

使用下面的代码可以对字符串执行实际的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

游乐场: http://play.golang.org/p/7cbwryZk8r


非常感谢您的回答!我不知道使用单引号会将字符串转换为代码点。感谢您提供包括特殊字符在内的ASTM实现!非常感谢您的时间,请度过愉快的一天! - user3220657
是的,单引号表示rune literal。偶尔会派上用场。此外,您可能需要添加错误检查,例如在找不到ETX或ETB等情况下。祝您编写Go代码愉快! :) - ANisus

1
你可以使用ParseInt函数,它位于strconv包中。

ParseInt函数将给定进制(2到36)的字符串s转换为对应的整数i。如果base == 0,则根据字符串的前缀推断进制:对于"0x",进制为16;对于"0",进制为8;否则进制为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)
}

游乐场


非常感谢您的回答!抱歉我的解释不够清楚,实际上我需要逐个将像"hijklmn"这样的单词转换为十六进制,并获得它们的总和值。感谢您教我可以在其他地方使用ParseInt。感谢您的时间,请度过愉快的一天! - user3220657

0
例如,
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

非常感谢您的回答!这完全解决了我的问题!我一整天都在尝试弄清楚,但自己无法解决。真的非常感谢!! - user3220657

0
你不想要“将字符转换为十六进制”,因为十六进制(以及十进制、二进制和所有其他整数的基-N表示)是用于向人类显示数字并消费它们的。计算机可以自由地以任何形式存储它所操作的数字;虽然大多数(全部?)现实世界的计算机都以二进制形式存储它们——使用位,但它们不必这样做。
我要引导你的是,你实际上想要将你的“使用十六进制表示法表示数字的字符”(“显示形式”)转换为数字(计算机所操作的内容)。为此,你可以使用已经建议过的strconv包,或者编写自己的简单转换代码。或者你可以从encoding/hex标准包中获取一个——看看它的fromHexChar函数。

非常感谢您回答我的问题!感谢您引导我到正确的方向。我认为我对实际的十六进制和整数理解有误或知识不足。根据您提供的信息,我会重新学习它们。非常感谢! - user3220657

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接