Извините, если на этот вопрос где-то уже есть ответ, но поскольку я еще почти ничего не знаю ни о big / little endian, ни о PostGreSQL, я не знаю, как искать ответ.
В коде, с которым я работаю, мы используем базу данных PostGreSQL и клиент libpq для доступа к нашей базе данных через двоичный формат. PostGreSQL использует прямой порядок байтов. Таким образом, мы должны преобразовать результаты запроса из libpq из big- в host-endian (в нашем случае little-endian).
Код для этого выглядит так:
result = PQgetvalue( res, i, i_fnum );
//int16_t val = be16toh( *((uint16_t *)result ); //***
и res
- это int16 с прямым порядком байтов, полученный вызовом PQexecParams()
.
Насколько я понимаю, в строке ***
отсутствует приведение, и строка должна быть
int16_t val = *((int16_t *)&be16toh( *((uint16_t *)result ) ); //***
в противном случае отрицательные значения читаются неправильно, и у нас есть поведение, определяемое реализацией.
Я сомневаюсь, что проблема в PostGreSQL спецификациях c, но вероятность, что это так, поэтому я пытаюсь опишите всю настройку.
Изменить: в комментариях я прочитал, что мой состав не имеет смысла в C ++. Тем не менее, у меня есть проблема: как мне сказать компилятору интерпретировать битовый шаблон, возвращаемый be16toh, как знаковый тип, а не беззнаковый.
В различных вопросах / ответах по stackoverflow я читал следующее:
reinterpret_cast
невозможно и приводит к неопределенному поведению. static_cast
должен сохранить значение numeri c таким же, если это возможно. Если это невозможно, то это поведение, определяемое реализацией.
Таким образом, я понятия не имею, как это сделать.