H5W3
当前位置:H5W3 > 其他技术问题 > 正文

Golang中如何int 16进制转byte再转int

问题:
已知一段16进制的数0x5AF3ACA48850,需要转成8位的byte字节。存在几个问题:

  • int转byte之后,得到的是[172 164 136 80] 而如何才可以得到这种输出?[]byte{0x17, 0xED, 0x48, 0x94, 0x1A, 0x08, 0xF9, 0x81} 因为需要直接填入到代码中,不能直接写数值。
  • 再转回来的时候,数值对不上了。比如n2,数值0x5AF3ACA48850,转成byte,再转成int,却变成了-1398503344
  • 很奇怪,第一个数pqStr解出来的int值不是0x5AF3ACA48850

代码:

package main
import (
"bytes"
"encoding/binary"
"fmt"
"strconv"
)
func int2Str16(n int) string {
return strconv.FormatInt(int64(n), 16)
}
func int2bytes(n int) []byte {
x := int32(n)
bytesBuffer := bytes.NewBuffer([]byte{})
_ = binary.Write(bytesBuffer, binary.BigEndian, x)
return bytesBuffer.Bytes()
}
func bytes2int(b []byte) int {
bytesBuffer := bytes.NewBuffer(b)
var x int32
_ = binary.Read(bytesBuffer, binary.BigEndian, &x)
return int(x)
}
func main() {
// 0x5AF3ACA48850
pqStr := string([]byte{0x17, 0xED, 0x48, 0x94, 0x1A, 0x08, 0xF9, 0x81}) // length=8
pqByte := []byte(pqStr)                                                 // [23 237 72 148 26 8 249 129]
pqInt := bytes2int(pqByte)                                              // 401426580
pqStr16 := int2Str16(pqInt)                                             // 17ed4894
fmt.Printf("pqStr16=%+v pqStr=%s pqInt=%+v pqByte=%+vn", pqStr16, pqStr, pqInt, pqByte)
n2 := 0x5AF3ACA48850 // 10进制值=100002620016720 16进制值=0x5AF3ACA48850
n2Str16 := int2Str16(n2)   // 5af3aca48850
n2Byte := int2bytes(n2)    // [172 164 136 80]
n2Int := bytes2int(n2Byte) // -1398503344
n2Int16 := int64(n2Int)    // -1398503344
fmt.Printf("n2=%v n2Str16=%s n2Byte=%v n2Int=%v n2Int16=%vn", n2, n2Str16, n2Byte, n2Int, n2Int16)
}

回答

    package main  

    import (  
       "encoding/binary"  
     "fmt")  

    func main() {  
         const x = 0x5AF3ACA48850  

         fmt.Println(int64(x))  

         var data = make([]byte, 8)  

         // 大端序  我们一般采用的是大端序. 小端序不考虑
         binary.BigEndian.PutUint64(data, uint64(x))  
         fmt.Println(data)  
          // output:  
         // [0 0 90 243 172 164 136 80]  
         // 小端序 binary.LittleEndian.PutUint64(data, uint64(x))  
         fmt.Println(data)  
         // output:  
         // [80 136 164 172 243 90 0 0]  
         var bytes = []byte{0, 0, 90, 243, 172, 164, 136, 80}  
         fmt.Println(binary.BigEndian.Uint64(bytes) == uint64(x))  
        // true
   }

因此:

  1. int转byte之后,得到的是[172 164 136 80] 而如何才可以得到这种输出?[]byte{0x17, 0xED, 0x48, 0x94, 0x1A, 0x08, 0xF9, 0x81} 因为需要直接填入到代码中,不能直接写数值。

int 转 byte 之后,得到的是 [0 0 90 243 172 164 136 80] ,因此填入代码应该是这么写:

 var bytes = []byte{0, 0, 90, 243, 172, 164, 136, 80} 

如果你需要使用16进制写法的话. 你手动算一下就行了,也可以在线工具算一下:

var bytes = []byte{0, 0, 0x5a, 0xf3, 0xac, 0xa4, 0x88,0x50}

你上面的写法的问题在于. 0x5AF3ACA48850 数值太大了,超过了 int32 的最大值,溢出了,应该使用的是 int64 去转换.

还有我转换的结果与你的不相等,不知道是否你的是正确与否

本文地址:H5W3 » Golang中如何int 16进制转byte再转int

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址