我有两个应用程序,一个是用php编写的,一个是在python中编写的,它们都使用相同的mysql数据库。
对于某些表中条目的公共id,我使用二进制(16)字段(我不能更改这个,必须保持这种方式)。
问题是python如何转换这个二进制字段?
让我们以其中一个条目为例。
当我在php(从db)中获得它时,公共id的值是°•WiCÄ‘õ0Iò|–g,,相同的值显示在SequelPro中。但是php myAdmin在二进制字段上执行十六进制函数,并显示myAdmin。现在,我在php中设法将二进制转换为php myAdmin中显示的值,并且它对所有条目都有效,但我刚刚注意到python进行了另一次转换。当我通过python获得本例中使用的条目时,公共id是owwweye1rjnvt3i1d0ib18x3.
我需要实现的是在php中将从°•WiCÄ‘õ0Iò|–g获得的MySql: MySql转换为python看到的:owwweye1rjnvt3i1d0ib18x3.。php应用程序调用python (不是由我开发的),因此id需要以相同的格式进行成功的调用。
欢迎任何建议。谢谢。
编辑:如果我将°•WiCÄ‘õ0Iò|–g从php发送到python并打印出来,我得到:°•WiCÄ‘õ0Iò|–g。
发布于 2015-01-08 11:07:09
我终于解决了这个问题。
似乎python会转换为base36,而不是我错误地认为的十六进制。
我试过简单地从16岁到36岁的0bb09557691443c491f53049f27c9667,但是我得到了owwweye1rk04k4cskkw4s08s.这并不是我所需要的,但随着它开始看起来像owwweye1rjnvt3i1d0ib18x3.,它又向前迈出了一大步。
这种差异应该是由于要转换的值很大(精度下降)而出现的,因此我进一步研究并找到了Clifford dot在gmail dot 上在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;
}
?> 我不认为其他人会经常遇到这个问题,但如果真的发生,他们还是希望能找到这个问题,而不是像我那样烧掉自己的脑袋:))
https://stackoverflow.com/questions/27835089
复制相似问题