php - 在 PHP 中实现 Crockford Base32 编码

标签 php encoding base32

我正在尝试使用 Crockford Base32 Algorithm 对字符串进行编码.

不幸的是,my current code只接受数值作为输入。我想将 ASCII 字符转换为十进制或八进制,但是 010100 的连接导致 10100 这使得无法解码这个。有什么方法可以做到这一点我不知道吗?

最佳答案

我相信这应该是一个更有效的 Crockford Base32 encoding 实现:

function crockford_encode( $base10 ) {
    return strtr( base_convert( $base10, 10, 32 ),
                  "abcdefghijklmnopqrstuv",
                  "ABCDEFGHJKMNPQRSTVWXYZ" );
}

function crockford_decode( $base32 ) {
    $base32 = strtr( strtoupper( $base32 ), 
                     "ABCDEFGHJKMNPQRSTVWXYZILO",
                     "abcdefghijklmnopqrstuv110" );
    return base_convert( $base32, 32, 10 );
}

( demo on codepad.org )

请注意,由于 PHP 的 base_convert() 函数中的已知限制(或者,可以说是错误),这些函数只会返回可以由 PHP 的内部数字类型(可能是 double )准确表示的值的正确结果。我们希望这将在未来的某个 PHP 版本中得到修复,但与此同时,您始终可以使用 this drop-in replacement for base_convert()


编辑:计算可选校验位的最简单方法可能就是这样:

function crockford_check( $base10 ) {
    return substr( "0123456789ABCDEFGHJKMNPQRSTVWXYZ*~$=U", $base10 % 37, 1 );
}

或者,对于大数:

function crockford_check( $base10 ) {
    return substr( "0123456789ABCDEFGHJKMNPQRSTVWXYZ*~$=U", bcmod( $base10, 37 ), 1 );
}

然后我们可以像这样使用它:

function crockford_encode_check( $base10 ) {
    return crockford_encode( $base10 ) . crockford_check( $base10 );
}

function crockford_decode_check( $base32 ) {
    $base10 = crockford_decode( substr( $base32, 0, -1 ) );
    if ( strtoupper( substr( $base32, -1 ) ) != crockford_check( $base10 ) ) {
        return null;  // wrong checksum
    }
    return $base10;
}

( demo on codepad.org )

注意:(2014 年 7 月 18 日)上述代码的原始版本在 Crockford 字母字符串中存在错误,因此它们读取 ...WZYZ ...WXYZ,导致一些数字被错误地编码和解码。此错误现已修复,codepad.org 版本现在包含一个基本的自检例程来验证这一点。感谢 James Firth 发现错误并修复它。

关于php - 在 PHP 中实现 Crockford Base32 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14075672/

相关文章:

php - 使用包含 500 多行的表时 IE 变慢

PHP:有哪些选项可以重构双重使用的类名?

php - 无法理解Mysql/php

.net - 保证唯一性的最短可能的 Guid 编码

PHP 函数可出于多种目的安全地编码字符

php - 使用 PHP 合并本地和在线数据库

excel - 如何在 Excel VBA 中对字符串进行 URL 编码?

java - 为什么 Apache Commons Base32 解码在此处返回任何空数组?

java - img标签的base32图像

Crockford 的 Base32 编码/解码的 Java 实现