Tôi đang sử dụng big.NewInt (int64 (e)). Bytes() để chuyển đổi int32 thành mảng byte. Có cách nào thanh lịch hơn để thực hiện việc này không?Chuyển đổi mảng int32 sang byte trong go
Tôi hy vọng AQAB là base64 giá trị được mã hóa của e
http://play.golang.org/p/M46X7OpZpu
const e = 65537
func base64Encode(b []byte) string {
return strings.TrimRight(base64.StdEncoding.EncodeToString(b), "=")
}
func main() {
fmt.Printf("exp %d\n", e)
b := make([]byte, 4)
binary.BigEndian.PutUint32(b, e)
fmt.Printf("b: BigEndian.PutUint32 %x (Bad) %s\n", b, base64Encode(b))
b2 := make([]byte, 4)
binary.BigEndian.PutUint32(b2, e)
for i := range b2 {
if b2[i] != 0 {
b2 = b2[i:]
break
}
}
fmt.Printf("b2: BigEndian.PutUint32 %x (Good) %s\n", b2, base64Encode(b2))
b4 := big.NewInt(int64(e)).Bytes()
fmt.Printf("b4: big.NewInt(int64(e)).Bytes() %x (Good) %s\n", b4, base64Encode(b4))
}
Output:
exp 65537
b: BigEndian.PutUint32 00010001 (Bad) AAEAAQ
b2: BigEndian.PutUint32 010001 (Good) AQAB
b4: big.NewInt(int64(e)).Bytes() 010001 (Good) AQAB
exp 1
b: BigEndian.PutUint32 00000001 (Bad) AAAAAQ
b2: BigEndian.PutUint32 01 (Good) AQ
b4: big.NewInt(int64(e)).Bytes() 01 (Good) AQ
exp 1000000
b: BigEndian.PutUint32 000f4240 (Bad) AA9CQA
b2: BigEndian.PutUint32 0f4240 (Good) D0JA
b4: big.NewInt(int64(e)).Bytes() 0f4240 (Good) D0JA
Edit:
Tôi đã làm chuẩn b2 và b4:
b2 1000000000 68.1 ns/op 8 B/op 1 allocs/op
b4 200000000 248 ns/op 90 B/op 3 allocs/op
tôi sẽ sử dụng b2 cho bây giờ ...
Không chỉ 'unsafe' an toàn bộ nhớ nghỉ ngơi, nó giới thiệu các vấn đề endian. –
@larsmans: Cũng như tự thay đổi một chút; hơn nữa, bản thân 'encoding/binary' là endian-aware (http://golang.org/pkg/encoding/binary/#pkg-variables). – voidlogic
Không, dịch chuyển là an toàn. 'x >> 24' sẽ nhận được 8 bit thứ tự cao của' x', bất kể tính cuối cùng. –