2013-06-23 41 views
14

Tôi đang cố gắng chuyển đổi một mảng int16 thành byte nhưng tôi không thể làm cho nó hoạt động.
Đây là những gì tôi đã có ngay bây giờ:int16 đến mảng byte

int16 i := 41 
a := []byte(string(i))//this line is wrong 

Ngoài ra nếu ai đó tự hỏi mảng cần phải được chiều dài 2.

+0

Bạn có muốn các byte riêng lẻ của int16 không? – fuz

Trả lời

19

Nếu bạn muốn nhận được các byte của một int16, hãy thử một cái gì đó như thế này:

var i int16 = 41 
var h, l uint8 = uint8(i>>8), uint8(i&0xff) 

Cố gắng gây khó khăn cho việc viết chương trình phụ thuộc vào thuộc tính của nền tảng của bạn, chẳng hạn như thứ tự byte. Do đó, loại punning dẫn đến phụ thuộc như vậy (chẳng hạn như overlaying một mảng byte với một int16) bị cấm.

Trong trường hợp bạn thực sự muốn tự bắn mình vào chân, hãy thử gói unsafe.

+0

Cảm ơn, hoạt động hoàn hảo !! : D Và xin lỗi nhưng tôi không thể wote bạn trả lời bởi vì tôi không có 15 điểm nào được nêu ra .. – Max

+0

@Max Không có vấn đề gì. Vui chơi mã hóa! – fuz

43

Trong khi câu trả lời FUZxxl của hoạt động, bạn cũng có thể sử dụng mã hóa/nhị phân gói:

var i int16 = 41 
b := make([]byte, 2) 
binary.LittleEndian.PutUint16(b, uint16(i)) 

Mã hóa/gói nhị phân có chức năng dựng sẵn cho mã hóa Little và Big Endian cho tất cả các số nguyên kích thước cố định và một số dễ sử dụng nếu bạn đang sử dụng Readers and Writers thay vì byte slice. Ví dụ:

var i int16 = 41 
err := binary.Write(w, binary.LittleEndian, i) 
+0

Không phải điều này sẽ chậm hơn rất nhiều so với việc chuyển hai byte để tạo thành một uint16? – fuz

+0

@fuz "Đơn giản chỉ cần chuyển ... byte" là chính xác những gì các chức năng đó làm, do đó trình biên dịch có tùy chọn nội tuyến hoạt động đó nếu nó muốn. Về cơ bản bạn đang yêu cầu ở đây nếu bạn nên tự inline các chức năng nhỏ hơn là để cho trình biên dịch quyết định nếu/khi làm điều đó. Trong hầu hết các trường hợp, câu trả lời cho câu hỏi đó là "không". – GrandOpener