Предполагая, что вы знаете о строгом нарушении правила псевдонима , ваш код будет генерировать ожидаемый результат в архитектуре big endian , в которой хранятся четыре байта, составляющие целое число начиная с самого старшего байта:
------------------------------------------------------------------------------
| byte3 (bit 24:31) | byte2 (bit 16:23) | byte1 (bit 8:15) | byte0 (bit 0:7) |
------------------------------------------------------------------------------
Но вы, очевидно, выполняете свой код на машине с архитектурой little endian :
------------------------------------------------------------------------------
| byte0 (bit 0:7) | byte1 (bit 8:15) | byte2 (bit 16:23) | byte3 (bit 24:31) |
------------------------------------------------------------------------------
Итак, чтобы сместить ваше целое число в массиве char, вам необходимо:
- Байт 0 из
i
, то есть i >> (8 * 0)
, имеет индекс 0 массива wirte_buff
- Байт 1 из
i
, то есть i >> (8 * 1)
, имеет индекс 1 из wirte_buff
array - Байт 2 из
i
, то есть i >> (8 * 2)
, является с индексом 2 из wirte_buff
массив - Байт 3 из
i
, то есть i >> (8 * 3)
, находится с индексом 3 из wirte_buff
массив
Это переводит в
wirte_buff[n] = (i >> 8*(n)) & 0xFF;
и то же, конечно, для j
:
wirte_buff[4+n] = (j >> 8*(n)) & 0xFF;