在Golang总和十六进制

问题描述 投票:2回答:4

感谢您阅读我的问题。我试图在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可以选择多个答案。感谢大家回答我,祝你有愉快的一天!

go hex
4个回答
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

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

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


1
投票

你可以使用ParseInt包中的strconv

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)
}

Playground


0
投票

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

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


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
© www.soinside.com 2019 - 2024. All rights reserved.