Кодирование 20-битного числа в байтах в Go - PullRequest
1 голос
/ 20 февраля 2020

У меня есть следующая схема, которую я пытаюсь достичь в Go.

На данный момент я могу понять, как кодировать / устанавливать биты 6 и 7 из байта 0

// Element ID flag
bytesToSend[0] |= (1 << 7)

//N/S Flag 
bytesToSend[0] |= (1 << 6)

Однако я не могу понять, как кодировать 20-битный «номер блока» в Go.

Я действительно думаю, что читать его я буду делать ...

block_num_out := ((int(bytesToSend[0]) & 0x0f) << 16) | (int(bytesToSend[1]) << 8) | (int(bytesToSend[2]))

Моя кодировка, которую я пробовал ...

block_num_in := 343348
bytesToSend[0] |= block_num_in << 16

Но это дает ошибку ...

invalid operation: bytesToSend[0] |= block_num_in << 16 (mismatched types byte and int)

Я также пытался

block_num_in := 343348
bytesToSend[0] |= (byte(block_num_in) << 16) & 0x0f
bytesToSend[1] |= byte(block_num_in) << 8
bytesToSend[2] |= byte(block_num_in)

Есть идеи? Спасибо!

bytes layout

1 Ответ

2 голосов
/ 20 февраля 2020

При записи вы должны использовать противоположное направление смещения. И так как block_num_in имеет тип int, вы должны преобразовать результат в byte:

bytesToSend[0] |= byte(block_num_in >> 16 & 0x0f)
bytesToSend[1] = byte(block_num_in >> 8 & 0xff)
bytesToSend[2] = byte(block_num_in)

Также, если вам нужно много битового кунг-фу, включающего шаг байтовых границ, рассмотрите используя github.com/icza/bitio (раскрытие: я автор).

...