Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
304 views
in Technique[技术] by (71.8m points)

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)
    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 去转换.

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

56.7k users

...