из питона, как записать целое число в (шестнадцатеричном) поле байта

1

проблема заключается в следующем: in (pl) код python, мы вычислили целое число = 26663. Может легко преобразовать это в hex с помощью hex (myint) = 0x6827

Все идет нормально!

Теперь, как записать это значение -into в конкатенацию strings- в поле postgreSQL (v9) bytea? БД кодируется UTF8, если это имеет значение.

EG, ни один из этих примеров не будет работать:

Здесь, конечно, я не могу объединить объекты "str" и "int":

rv = plpy.execute(plan, [ (string1 + 6827) ])

Этот вход вводит неверный шестнадцатеричный код для 0x6827

rv = plpy.execute(plan, [ (string1 + str('6827')) ])

Помогите!

Теги:
plpython

1 ответ

2
Лучший ответ

Я не знаком с Postgres, но функция hex(n) возвращает строковое представление числового значения n в шестнадцатеричном формате. Самый лучший способ, по моему мнению, связать это со строкой - использовать строки форматирования. Например:

rv = plpy.execute(plan, [ ( 'foo %s bar' % hex(6827) ) ] )

Если строка действительно находится в переменной с именем string1, и вам нужно только добавить ее с шестнадцатеричным значением, тогда простая конкатенация с использованием знака + будет работать нормально:

rv = plpy.execute(plan, [ ( string1 + hex(6827) ) ])

Это работает без преобразования, потому что функция hex() возвращает строку.

Если вы фактически не хотите хранить печатное строковое представление, а скорее двоичную строку, используйте модуль struct для создания массива байтов.

import struct
bytes = struct.pack('i', 6827) # Ignoring endianness

Многие люди смущены тем, что на самом деле означает что-то вроде "двоичного", и поскольку вы используете тип поля (bytea), который, как представляется, предназначен для двоичного хранения, возможно, это то, что вы на самом деле хотите?

Возвращаемое значение из байтов будет строкой, которую вы можете либо объединить с другой строкой, либо продолжить паковать больше двоичных значений.

Дополнительную информацию см. В документации по модулю.

  • 0
    спасибо за ваш комментарий - сейчас я проверю модуль struct. Да, действительно, я думаю, что модуль struct может быть тем, что мне нужно. Это входит в «строку» из 4 байтов.
  • 0
    Да, похоже, что struct.pack сделает это, но у меня чертовски много времени разбирает параметры форматирования; Я пытаюсь «упаковать налево» на машине с прямым порядком байтов - что-то вроде struct.pack ('i', 26663). Цель - 4 байта, я думаю, что этот вид вывода из pack сделает свое дело: \ x00 \ x00 \ x68 \ x27 Можете ли вы предложить дальнейшие рекомендации?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню