在Golang上求和十六进制

时间:2014-03-17 04:57:21

标签: go hex

感谢您阅读我的问题。 我试图计算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 个答案:

答案 0 :(得分:2)

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'/ P>

游乐场: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

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

答案 1 :(得分:1)

您可以使用ParseInt包中的strconv

  

ParseInt解释给定基数(2到36)中的字符串s并返回相应的值i。如果base == 0,则字符串的前缀暗示基数:“16”表示“0x”,基数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)
}

Playground

答案 2 :(得分: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

答案 3 :(得分:0)

您不希望“将字符转换为十六进制”,因为十六进制(以及十进制和二进制以及所有其他整数的基本N表示)用于向人类显示数字并将其消耗回来。计算机可以自由地以任何形式存储其操作的号码;虽然大多数(全部?)真实世界的计算机将它们存储在二进制形式 - 使用位中,但它们并不需要。

我要引导您的是,您实际上想要使用十六进制表示法(“显示形式”)将表示数字的字符转换为数字(计算机操作的数字)。为此,您可以使用已建议的strconv包,也可以使用自己的简单转换代码。或者您可以从encoding/hex标准包中获取一个 - 请参阅其fromHexChar函数。