Как преобразовать 10 байтов в число uint16 и восстановить массив из числа - PullRequest
0 голосов
/ 30 апреля 2020

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

 s, d := net.IP{172, 16, 100, 11}, net.IP{10, 0, 88, 11}
 var sp uint16 = 54876
 //var dp uint16 = 445

 var spByte = make([]byte, 2)
 binary.BigEndian.PutUint16(spByte, sp)

 var x = make([]byte, 10) // [172 16 100 11 10 0 88 11 214 92]
 copy(x[:4], s)
 copy(x[4:], d)
 copy(x[8:], spByte)

 ret := binary.BigEndian.Uint32(x)

 var a, z uint16
 a = uint16(ret >> 16)
 z = uint16(ret & 0xFFFF)

 newret := (uint32(a) << 16) | uint32(z)


 var xs = make([]byte,10) // [172 16 100 11 0 0 0 0 0 0]
 binary.BigEndian.PutUint32(xs,newret)

Я пытаюсь получить число из массива [172 16 100 11 10 0 88 11 214 92], а затем восстановить указанный массив с того же номера.

1 Ответ

0 голосов
/ 30 апреля 2020

Используйте этот код для упаковки и распаковки значений из кусочка байта:

s, d := net.IP{172, 16, 100, 11}, net.IP{10, 0, 88, 11}
var sp uint16 = 54876

var x = make([]byte, 10) // [172 16 100 11 10 0 88 11 214 92]
copy(x[:4], s)
copy(x[4:], d)
binary.BigEndian.PutUint16(x[8:], sp)

s2 := binary.BigEndian.Uint32(x)
d2 := binary.BigEndian.Uint32(x[4:])
sp2 := binary.BigEndian.Uint16(x[8:])

fmt.Printf("s: %x %x\n", []byte(s), s2)
fmt.Printf("d: %x %x\n", []byte(d), d2)
fmt.Printf("sp: %d %d\n", sp, sp2)

Попробуйте на GoLang PlayGround: https://play.golang.org/p/MFzdVtyoBsm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...