我有两个用 php 编写的应用程序和一个用 python 编写的应用程序,它们都使用相同的 mysql 数据库。
对于某些表中条目的公共ID,我使用二进制(16)字段(我不能更改它,它必须保持这种方式)。
问题是python如何转换这个二进制字段?
我们以其中一个条目为例。
当我在php(来自数据库)中获取它时,公共ID的值为°•WiCÄ'õ0Iò| -g ,SequelPro中显示相同的值。但是php myAdmin在二进制字段上执行十六进制函数并显示 0bb09557691443c491f53049f27c9667 。现在我在php中管理将二进制文件转换为php myAdmin中显示的值,它适用于所有条目,但我只是注意到python执行了另一次转换。当我通过python获得此示例中使用的条目时,公共ID为 owwweye1rjnvt3i1d0ib18x3 。
我需要实现的是在php中转换我从MySql获得的内容:°•WiCÄ'õ0Iò| -g 到python看到的内容: owwweye1rjnvt3i1d0ib18x3 。 php应用程序调用python(不是由我开发),因此id需要采用相同的格式才能成功调用。
欢迎任何建议。感谢。
编辑:如果我将°•WiCÄ'õ0Iò| -g 从php发送到python并打印出来,我得到:°WiCÓâ€〜Ãμ0Iò| €“克
答案 0 :(得分:1)
最后我对此进行了整理。
似乎python转换为base36而不是十六进制,因为我错误地认为。
我尝试过简单地将 0bb09557691443c491f53049f27c9667 从16改为36但我已经 owwweye1rk04k4cskkw4s08s 了。不是我真正需要的东西,但它仍然是一个很大的进步,因为它开始看起来像 owwweye1rjnvt3i1d0ib18x3 。
我应该出现这种差异,因为要转换的值很大(精度损失),所以我进一步研究并找到了波纹管功能,由 Clifford dot ct写在gmail dot com < / strong>在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;
}
?>
我不认为其他人会经常遇到这个问题,但如果发生这种情况仍然希望他们能够找到这个,而不是像我一样烧掉他们的脑筋:))))