在PHP中实现Crockford Base32编码
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在PHP中实现Crockford Base32编码,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1806字,纯文字阅读大概需要3分钟。
内容图文
![在PHP中实现Crockford Base32编码](/upload/InfoBanner/zyjiaocheng/749/f4088cb5780e4bbca2b89e96ca37fe73.jpg)
我正在尝试使用Crockford Base32 Algorithm对字符串进行编码.
不幸的是,my current code只接受数值作为输入.我想到将ASCII字符转换为十进制或八进制,但是然后010和100的串联导致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 );
}
请注意,由于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;
}
注意:(2014年7月18日)上面代码的原始版本在Crockford字母表字符串中有一个错误,因此它们读取… WZYZ而不是… WXYZ,导致某些数字被编码和解码不正确.这个bug现在已得到修复,而codepad.org版本现在包含一个基本的自测例程来验证这一点.感谢James Firth发现错误并修复它.
内容总结
以上是互联网集市为您收集整理的在PHP中实现Crockford Base32编码全部内容,希望文章能够帮你解决在PHP中实现Crockford Base32编码所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。