Преобразование в порядок следования знаков со знаком (PostGreSQL значений) - PullRequest
0 голосов
/ 28 мая 2020

Извините, если на этот вопрос где-то уже есть ответ, но поскольку я еще почти ничего не знаю ни о 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 таким же, если это возможно. Если это невозможно, то это поведение, определяемое реализацией.

Таким образом, я понятия не имею, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...