Вставка байта в тип байта по индексу - PullRequest
0 голосов
/ 17 мая 2019

Я нашел этот ответ на аналогичный вопрос, где можно извлечь байт из более крупного типа. То, что я хотел бы знать, - что было бы наоборот этой процедуры при использовании значения индекса?

Чтобы извлечь байт от пользователя 32-битного типа Пит Уилсон дал следующее:

int a = (the_int >> 24) & 0xff;  // high-order (leftmost) byte: bits 24-31
int b = (the_int >> 16) & 0xff;  // next byte, counting from left: bits 16-23
int c = (the_int >>  8) & 0xff;  // next byte, bits 8-15
int d = the_int         & 0xff;  // low-order byte: bits 0-7

Я бы хотел сделать обратное со значением индекса:

// assume int = 32bit or 4 bytes and unsigned char = 8bit or 1 byte
void insertByte( unsigned char a, unsigned int& value, unsigned idx ) {
    // How to take byte and insert it into the byte position
    // of value at idx where idx is [0-3] from the right
}

Вот пример по значению:

unsigned char a = 0x9D;
unsigned int value = 0;

insertByte( a, value, 0 ); // value = 0x0000009D;
insertByte( a, value, 1 ); // value = 0x00009D00;
insertByte( a, value, 2 ); // value = 0x009D0000;
insertByte( a, value, 3 ); // value = 0x9D000000;
// insertByte( a, value, >3 ); // invalid index

Редактировать

Пользователь jamit поделился своим вопросом в комментариях. Я думаю в данный момент, потому что это будет поведение конструктора для шаблона класса; Я хочу вставить и заменить, а не вставлять и сдвигать.

* +1025 * Пример:
unsigned int value = 0x01234567;
unsigned char a = 0x9D;
insertByte( a, value, 2 );
// value = 0x019D4567

Ответы [ 2 ]

2 голосов
/ 17 мая 2019

Просто приведите свой символ к типу int, сдвиньте его на необходимое количество байтов и добавьте к своему значению.

void insertByte( unsigned char a, int& value, unsigned int idx ) {
    if(idx > 3)
        return;
    // Clear the value at position idx
    value &= ~(0xff << (idx*8));

    int tmp = a;
    tmp = (tmp << (idx * 8));

    // Set the value at position idx
    value |= tmp; 
}
1 голос
/ 17 мая 2019

Чтобы инвертировать то, что вы получили из другого ответа:

unsigned a = (the_int & 0x00ffffff) | (the_byte << 24);  // set high-order byte: bits 24-31
unsigned b = (the_int & 0xff00ffff) | (the_byte << 16);  // next byte, bits 16-23
unsigned c = (the_int & 0xffff00ff) | (the_byte << 8);   // next byte, bits 8-15
unsigned d = (the_int & 0xffffff00) | (the_byte);        // low-order byte: bits 0-7

Противоположность побитового - и побитового - или, а противоположность сдвига вправо - сдвиг влево.Оставшаяся сложность - очистить любое старое значение в байте, что делается с помощью новых масок.(Если вы игнорируете новые маски, это сдвиг влево, за которым следует побитовое или. Сравните это с извлечением байтов со сдвигом вправо, за которым следует побитовое и.)

Текущая версияОтвет user1178830 - более программный способ сделать это.

...