Как Python преобразует двоичный файл mysql (16)

У меня есть два приложения, одно написано в PHP и один в питон и оба они используют одно и то же MySQL база данных.

Для открытого идентификатора записей в некоторых таблицах, которые я использую двоичный (16) поля (я не могу изменить это, он должен оставаться таким).

Вопрос в том, как python выполняет преобразование этого двоичного поля?

Давайте возьмем одну из записей в качестве примера.

Когда я получаю его в php (из БД), значение публичного идентификатора ° • WiCÄ’õ0Iò | -g, то же значение показано в SequelPro. Но php myAdmin выполняет шестнадцатеричную функцию над двоичными полями и показывает 0bb09557691443c491f53049f27c9667. Теперь мне удалось в php преобразовать двоичный файл в значение, показанное в php myAdmin, и это работает для всех записей, но я только что заметил, что python выполняет другое преобразование. Когда я получаю запись, используемую в этом примере через python, публичный идентификатор owwweye1rjnvt3i1d0ib18x3.

Чего мне нужно добиться, так это конвертировать в php то, что я получаю от MySql: ° • WiCÄ’õ0Iò | -g к тому, что видит питон: owwweye1rjnvt3i1d0ib18x3. Приложение php выполняет вызовы на python (не разработанные мной), поэтому для успешного вызова идентификатор должен быть в том же формате.

Любые предложения приветствуются. Благодарю.

РЕДАКТИРОВАТЬ: если я отправлю ° • WiCÄ’õ0Iò | -g из php в python и распечатав его, я получаю:  ° â € ¢ WICA «â € ~Ãμ0Iò | â €» г

1

Решение

Наконец-то я разобрался с этим.

Кажется, что Python конвертируется в base36, а не в hex, как я ошибочно предположил.

Я пытался просто base_convert 0bb09557691443c491f53049f27c9667 с 16 до 36 но у меня есть owwweye1rk04k4cskkw4s08s. Не совсем то, что мне нужно, но все же большой шаг вперед, так как он начал выглядеть owwweye1rjnvt3i1d0ib18x3.

Эта разница должна была появиться из-за больших значений, которые нужно преобразовать (потеря точности), поэтому я продолжил исследование и нашел нижеприведенную функцию, написанную Клиффорд точка CT на Gmail точка ком на сайте php.net:

<?php

function str_baseconvert($str, $frombase=10, $tobase=36) {
$str = trim($str);
if (intval($frombase) != 10) {
$len = strlen($str);
$q = 0;
for ($i=0; $i<$len; $i++) {
$r = base_convert($str[$i], $frombase, 10);
$q = bcadd(bcmul($q, $frombase), $r);
}
}
else $q = $str;

if (intval($tobase) != 10) {
$s = '';
while (bccomp($q, '0', 0) > 0) {
$r = intval(bcmod($q, $tobase));
$s = base_convert($r, 10, $tobase) . $s;
$q = bcdiv($q, $tobase, 0);
}
}
else $s = $q;

return $s;
}

?>

Я не думаю, что другие будут сталкиваться с этой проблемой очень часто, но все же, если это случится, надеюсь, что они найдут это вместо того, чтобы сжечь свой мозг, как я сделал :))))

1

Другие решения

Других решений пока нет …