Следует отметить, что весь подход к целому байт-обращению путем смешивания физического уровня доступа к памяти и значения-уровня побитовых операций выглядит весьма подозрительным.Я имею в виду, это может сработать для вас, но зачем кому-то так поступать?Какой смысл создавать такой странный микс?
Если вы решили прибегнуть к прямому доступу к физической памяти, переосмыслив целочисленное значение как последовательность из 4 байтов, естественным способом обращения было бы просто поменяться местами.байты 0 и 3 и поменяйте местами байты 1 и 2.
uint32_t byte_reverse_32(uint32_t num) {
union bytes {
uint8_t b[4];
uint32_t n;
} bytes;
uint8_t t;
bytes.n = num;
t = bytes.b[0]; bytes.b[0] = bytes.b[3]; bytes.b[3] = t;
t = bytes.b[1]; bytes.b[1] = bytes.b[2]; bytes.b[2] = t;
return bytes.n;
}
Альтернативным подходом было бы сделать все это на уровне значений, реализуя все с помощью побитовых операций без какой-либо реинтерпретации памяти.
uint32_t byte_reverse_32(uint32_t num) {
uint32_t res;
res = num & 0xFF; num >>= 8; res <<= 8;
res = num & 0xFF; num >>= 8; res <<= 8;
res = num & 0xFF; num >>= 8; res <<= 8;
res = num & 0xFF;
return res;
}
Оба вышеперечисленных подхода, если они реализованы правильно, будут переносимыми в том смысле, что они будут работать как на платформах с большими, так и на младших порядках байтов.Люди обычно обращаются к побитовому подходу на уровне значений специально для того, чтобы избегать реинтерпретации физической памяти через объединение, так как реинтерпретация памяти почти всегда является хаком.(то есть оба подхода, смешанные вместе), кажется, имеют очень мало смысла (если вообще есть).То, что у вас есть сейчас, будет выполнять обращение на платформе с прямым порядком байтов, но ничего не будет делать на платформе с прямым порядком байтов.Я понимаю, что вас могут не интересовать платформы с прямым порядком байтов, поэтому проблема для вас не критична.Но все же сочетание двух альтернативных (и обычно взаимоисключающих) техник мне кажется довольно странным.
Опять же, если вы уже решили использовать подход, основанный на объединении, просто поменяйте местами байты и покончите сэто.