使用GO语言将ASCII数字字符的字节数组转换为int

Kor*_*rba 14 arrays int type-conversion go

我看到了一些完全相同的问题的答案:如何在GO编程语言中将Byte数组转换为int?

我写下面的函数将字节数组转换为int

func convertByteToInt(in []byte) int32 {
    return  (int32(in[0]) << 24 | int32(in[1]) << 16 | int32(in[2]) << 8 | int32(in[3]))
}
Run Code Online (Sandbox Code Playgroud)

在此之前,我确保字节数组具有正确的(基数256)值.在[0] = 54(ASCII为6),[1] = 54(ASCII为6),[2] = 49(ASCII为1),[3] = 49(ASCII为1)中.

所以我期望从字节数组中检索整数6611的值,但我最终获得了909521201.我无法理解在这种简单的转换中究竟发生了什么.任何人都可以闪光吗?

谢谢

tom*_*asz 16

@Volker在他的评论中是正确的,你的数组中没有二进制数,你有一个ASCII字符串.但是,您尝试将其解码为二进制.注意,如果处理二进制数,则不需要验证任何输入(可能除了长度),因为所有单字节值都有效.

@ Ainar-G为您提供了一种将ASCII数转换为整数的方法.

比较这两种方法:(http://play.golang.org/p/_wufZ4P_aE)

buf := []byte{54, 54, 49, 49}

x, _ := strconv.Atoi(string(buf))
fmt.Println(x)
Run Code Online (Sandbox Code Playgroud)

这打印6611 ; 但看看这个:

var y int32
_ = binary.Read(bytes.NewReader(buf), binary.BigEndian, &y)
fmt.Println(y)
Run Code Online (Sandbox Code Playgroud)

这打印909521201,所以你得到了(并没想到).作为旁注,你手动将它解码为BigEndian,所以这不是最后的"如此简单的转换",因为还有一些因素需要考虑.

您手工制作的ASCII转换看起来或多或少如下:

var x int32
for _, c := range in {
    x = x*10 + int32(c - '0')
}
return x
Run Code Online (Sandbox Code Playgroud)

但使用strconv是要走的路.