Używam big.NewInt (int64 (e)) .Bytes() do konwersji tablicy int32 na tablicę bajtową. Czy istnieje bardziej elegancki sposób na zrobienie tego?Konwertowanie tablicy int32 na bajt w go
Spodziewam Aqab się być zakodowane base64 wartość 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))
}
wyjściowa:
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:
Mam porównywana b2 i b4:
b2 1000000000 68.1 ns/op 8 B/op 1 allocs/op
b4 200000000 248 ns/op 90 B/op 3 allocs/op
użyję b2 teraz ...
Nie tylko 'unsafe' bezpieczeństwo pamięci przerwa, wprowadza zagadnienia bajt. –
@ larsmans: Podobnie jak bit przesuwania rzeczy; Co więcej, samo kodowanie/binarne ma świadomość endianów (http://golang.org/pkg/encoding/binary/#pkg-variables). – voidlogic
Nie, zmiana biegów jest bezpieczna. 'x >> 24' otrzyma 8 bitów' x' wyższego rzędu, bez względu na endianness. –