2013-06-23 5 views
14

Я пытаюсь преобразовать int16 в массив байтов, но я не могу заставить его работать.
Вот что я получил прямо сейчас:int16 to byte array

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

Кроме того, если кто-то интересно, массив должен быть длиной 2.

+0

Вы хотите, чтобы отдельные байты int16? – fuz

ответ

19

Если вы хотите получить байты в int16, попробовать что-то например:

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

Go пытается затруднить запись программ, зависящих от атрибутов вашей платформы, таких как порядок байтов. Отсюда следует, что тип punning, который приводит к таким зависимостям (например, наложение байтового массива с int16), запрещен.

Если вы действительно хотите стрелять в ногу, попробуйте пакет unsafe.

+0

Спасибо, работает отлично !! : D И извините, но я не могу вас проголосовать, потому что у меня еще нет 15 очков. – Max

+0

@Max Нет проблем. Получайте удовольствие от кодирования! – fuz

43

Хотя ответ FUZxxl работает, вы можете также использовать кодирование/двоичный пакет:

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

Параметр/бинарный пакет кодирования имеет прекомпилированную функцию для кодирования больших и маленьких Endian для всех целых чисел фиксированного размера, а некоторые простых в использовании если вы используете читателей и писателей, а не байтовые фрагменты. Пример:

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

Разве это не будет намного медленнее, чем просто переместить два байта, чтобы сформировать uint16? – fuz

+0

@fuz «Простое изменение ... байтов» - это именно то, что выполняют эти функции, поэтому у компилятора есть возможность вставить эту операцию, если она захочет. По сути, вы спрашиваете здесь, нужно ли вручную вводить небольшие функции, а не позволять компилятору решить, когда/когда это сделать. В большинстве случаев ответ на этот вопрос «нет». – GrandOpener