感谢您阅读我的问题。
我正在尝试在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时等等。欢迎您。祝您编程愉快! :)

您可以使用strconv包中的ParseInt

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表示形式)在这里用于向人类显示数字并将其消费。计算机可以自由地实际存储其希望以任何形式运行的数字。虽然大多数(所有?)现实世界中的计算机都使用位以二进制形式存储它们,但它们不必这样做。

我要带您介绍的是,您实际上是想将使用十六进制表示法("显示形式")表示数字的字符转换为数字(计算机在其上操作)。为此,您可以按照建议使用strconv包,也可以滚动自己的简单转换代码。或者,您也可以从encoding/hex标准软件包中获取一个,请参见其fromHexChar功能。

  • 非常感谢您回答我的问题!感谢您将我引向正确的位置。我认为我对实际的十六进制和整数了解不甚了解或了解得如何。我将根据您提供的信息向我重新学习。非常感谢 !

例如,

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
  • 真的非常感谢您的回答!这完全解决了我的问题!一整天都在努力解决,但我自己解决不了。真的非常感谢!