из питона, как записать целое число в (шестнадцатеричном) поле байта - PullRequest
1 голос
/ 03 августа 2011

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

Пока все хорошо!

Теперь, как записать это значение - в конкатенацию строк - в байтовое поле PostgreSQL (v9)?DB имеет кодировку UTF8, если это имеет значение.

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

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

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

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

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

Справка!

1 Ответ

2 голосов
/ 03 августа 2011

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

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

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

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

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

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

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

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

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

См. Документацию для модуля struct для получения дополнительной информации!

...