Все примеры, которые я видел, читая удвоение числа известных порядковых номеров из буфера до порядковых номеров платформ, включают в себя обнаружение порядковых номеров текущей платформы и выполнение при необходимости замены байтов.
С другой стороны, явидел другой способ сделать то же самое, за исключением целых чисел, использующих сдвиг битов ( один такой пример ).
Это заставило меня задуматься о том, что можно было бы использовать объединение иТехнология битового сдвига для чтения двойных (и плавающих) значений из буферов, и реализация быстрого теста, похоже, сработала (по крайней мере, с помощью clang на x86_64):
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
double read_double(char * buffer, bool le) {
union {
double d;
uint64_t i;
} data;
data.i = 0;
int off = le ? 0 : 7;
int add = le ? 1 : -1;
for (int i = 0; i < 8; i++) {
data.i |= ((uint64_t)(buffer[off] & 0xFF) << (i * 8));
off += add;
}
return data.d;
}
int main() {
char buffer_le[] = {0x6E, 0x86, 0x1B, 0xF0, 0xF9, 0x21, 0x09, 0x40};
printf("%f\n", read_double(buffer_le, true)); // 3.141590
char buffer_be[] = {0x40, 0x09, 0x21, 0xF9, 0xF0, 0x1B, 0x86, 0x6E};
printf("%f\n", read_double(buffer_be, false)); // 3.141590
return 0;
}
Мой вопрос, хотя, является ли это безопасным способом сделатьэтот?Или здесь присутствует неопределенное поведение?Или если и этот, и метод перестановки байтов связаны с неопределенным поведением, один из них безопаснее другого?