python 如何转换 mysql 二进制文件(16)


How does python converts mysql binary(16)

我有两个应用程序,一个用php编写,一个用python编写,它们都使用相同的mysql数据库。

对于某些表中条目的公共 ID,我使用 binary(16) 字段(我无法更改它,它必须保持这种方式)。

问题是python如何转换这个二进制字段?

让我们以其中一个条目为例。

当我在 php(从数据库)中获取它时,公共 id 的值是 °•WiCÄ'õ0Iò|–g,相同的值显示在 SequelPro 中。但是 php myAdmin 对二进制字段执行十六进制函数并显示 0bb09557691443c491f53049f27c9667。现在我设法在 php 中将二进制文件转换为 php myAdmin 中显示的值,它适用于所有条目,但我刚刚注意到 python 进行了另一个转换。当我通过python获取此示例中使用的条目时,公共ID是owwweye1rjnvt3i1d0ib18x3

我需要实现的是用php将我从MySql获得的东西转换为python看到的:owwweye1rjnvt3i1d0ib18x3php 应用程序在 python 应用程序(不是我开发的)上进行调用,因此 id 需要采用相同的格式才能成功调用。

欢迎任何建议。谢谢。

编辑:如果我将°•WiCÄ'õ0Iò|–g从php发送到python并将其打印出来,我会得到:"Ń"WiCÃ

"

最后我解决了这个问题。

似乎 python 转换为 base36 而不是我错误地假设的十六进制。

我试图简单地从 0bb09557691443c491f53049f27c9667 从 16 到 36 简单地base_convert,但我有 owwweye1rk04k4cskkw4s08s不是我真正需要的,但仍然向前迈出了一大步,因为它开始看起来像 owwweye1rjnvt3i1d0ib18x3

这种差异我应该出现,因为要转换的值很大(精度损失),所以我进一步研究并找到了波纹管函数,由 Clifford dot ct 在 gmail dot com 上写 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; 
} 
?> 

我不认为其他人会经常遇到这个问题,但如果发生这种情况,仍然希望他们会找到这一点,而不是像我一样烧掉他们的大脑:))))