2015-01-06 1 views
0

У меня есть массив байтовпытается вставить целое число в массив байтов

app0 := []byte("\xff\xe0\x00\x10\x4a\x46\x49\x46\x00\x01\x01\x01\x00\x00\x00\x00\x00\x00") 

Я пытаюсь выяснить, как заменить app0[13:15] с два байта, содержащие 300.

Пожалуйста, помогите. Я попытался следующие, но он не будет даже скомпилировать:

app0[13:15] = []byte(300) 
+0

да, 300 помещается в два байта. – akonsu

ответ

1

Я немного запутался, что вы даже пытаетесь сделать с

app0[13:15] = []byte(300) 

А один байт не может иметь значение 300 , и у вас есть кусок байтов. Я предполагаю, что вы хотите, чтобы значение 300 преобразуется в два байта:

import (
    "fmt" 
    "bytes" 
    "encoding/binary" 
) 

func main() { 
    app0 := []byte("\xff\xe0\x00\x10\x4a\x46\x49\x46\x00\x01\x01\x01\x00\x00\x00\x00\x00\x00") 
    app0 = append(app0[:13], append(intToBytes(uint16(300)), app0[15:]...)...) 
    fmt.Println(app0) 
} 

func intToBytes(i uint16) []byte { 
    buf := new(bytes.Buffer) 
    _ = binary.Write(buf, binary.LittleEndian, i) 
    return buf.Bytes() 
} 

https://play.golang.org/p/qADHwCCFQG

Хитрость здесь вы должны действительно получить массив байтов, а затем вы можете использовать VARIADIC оператор (...), а затем append функция для замены внутренних элементов массива.

1

Например,

package main 

import "fmt" 

func main() { 
    app0 := []byte("\xff\xe0\x00\x10\x4a\x46\x49\x46\x00\x01\x01\x01\x00\x00\x00\x00\x00\x00") 
    fmt.Println(app0) 
    app0[13], app0[14] = 300>>8, 300&0xFF 
    fmt.Println(app0) 
} 

Выход:

[255 224 0 16 74 70 73 70 0 1 1 1 0 0 0 0 0 0] 
[255 224 0 16 74 70 73 70 0 1 1 1 0 1 44 0 0 0] 
+0

большое спасибо. этот код не переносится. он будет корректно работать только на малой архитектуре, верно? – akonsu

+0

@akonsu: Для архитектуры little-endian напишите: 'app0 [13], app0 [14] = 300 & 0xFF, 300 >> 8'. – peterSO