ocubom / base-convert
在任意进制之间安全地进行数字转换。
Requires
- php: >=7.0
Requires (Dev)
- friendsofphp/php-cs-fixer: *
- symfony/phpunit-bridge: ^5.0 || ^6.0 || ^7.0
README
大数字进制转换
在任意进制之间安全地进行数字转换。
关于Base Convert
Base Convert 在任意进制之间安全地进行数字转换。转换通过自定义实现进行,以避免原生PHP base_convert 函数 浮点精度问题。
使用的实现是从 Symfony UID 组件 中提取的。类 BinaryUtil
实现了必要的 fromBase
和 toBase
方法。这些方法已被提取以确保兼容性(它是一个内部类)并降低最低PHP版本要求。
入门
安装
请确保已全局安装 Composer,如 Composer 文档的 安装章节 中所述。
$ composer require ocubom/base-convert
用法
就像使用原生的 base_convert 一样。尽管实现与原生转换兼容,但它提供了一些改进
-
进制范围在2到62之间。原生版本仅支持2到36之间的进制。
-
支持“命名进制”。
-
可以使用特殊进制
bin
来转换二进制字符串。这可以直接转换某些函数的二进制输出。use function \Ocubom\Math\base_convert; $hex = base_convert(random_bytes(32), 'bin', 'hex');
警告
不要将二进制编码(
bin
)与Base2编码(包含字符0
和1
的文本字符串)混淆。在PHP中,有几个函数
在这个库中,字符串
bin
被认为是第一个函数集的等价物。 -
可以通过实现基接口来使用新的进制。
包括Douglas Crockford Base32和Satoshi Nakamoto Base58编码。这些实现是自定义编码的示例。
Douglas Crockford Base32编码
Douglas Crockford提出的Base32编码的安全版本。
注意
编码方案需要
对人类和机器都可读。
紧凑。人类在操作任意符号的长字符串时比较困难。
具有容错性。输入符号时不应该需要复杂的键盘操作。
具有可发音性。人类应能够通过电话准确地将符号传输给其他人。
—— Douglas Crockford. Base 32
此编码是可访问的
-
通过将
Crockford
对象作为base_convert
函数的任何基参数传入。use Ocubom\Math\Base\Crockford; use function Ocubom\Math\base_convert; // Encoding $crockford = base_convert(random_bytes(32), 'bin', new Crockford()); // Decoding $hex = base_convert($crockford, new Crockford(), 'hex');
-
使用
Crockford
类的encode
和decode
方法。use Ocubom\Math\Crockford; // Encoding $crockford = Crockford::encode(random_bytes(32), 'bin'); // Decoding $hex = Crockford::decode($crockford, 'hex');
-
使用
crockford_encode
和crockford_decode
函数。use function \Ocubom\Math\crockford_decode; use function \Ocubom\Math\crockford_encode; // Encoding $crockford = crockford_encode(random_bytes(32), 'bin'); // Decoding $hex = crockford_decode($crockford, 'hex');
可以添加一个额外的参数,以包含用于错误检测的校验和。
Satoshi Nakamoto Base 58 编码
比特币地址使用一种省略了可能引起混淆的字符的 Base 64 变体,结果是一种 Base 58 编码。
注意
为什么使用 base-58 而不是标准的 base-64 编码?
不希望有 0OIl 这样的字符,它们在某些字体中看起来相同,可能会被用来创建视觉上相同的数据。
非字母数字的字符串不容易被作为输入接受。
如果没有标点符号来中断,电子邮件通常不会换行。
如果整个字符串都是字母数字,双击将选择整个字符串作为一个单词。
—— Satoshi Nakamoto. 比特币源代码
通过将 Base58
对象作为 base_convert
函数的任何基参数传入,可以访问此编码。
use Ocubom\Math\Base\Base58; use function Ocubom\Math\base_convert; // Encoding $base58 = base_convert(random_bytes(32), 'bin', new Base58()); // Decoding $hex = base_convert($base58, new Base58(), 'hex');
路线图
请参阅开放问题,以获取完整的功能提议(以及已知问题)列表。
贡献
贡献使得开源社区成为一个如此惊人的学习、灵感和创造的地方。您做出的任何贡献都将被非常感谢。
如果您有改进此项目的建议,请克隆仓库并创建一个拉取请求。您也可以简单地打开一个带有“增强”标签的问题。
- 克隆项目。
- 创建您的功能分支(
git checkout -b feature/your-feature
)。 - 提交您的更改(
git commit -m 'Add your-feature'
)。 - 推送到分支(
git push origin feature/your-feature
)。 - 打开一个拉取请求。
作者
- Oscar Cubo Medina — https://ocubom.github.io
请参阅参与此项目的贡献者列表。
许可
在 MIT 许可证下分发。有关更多信息,请参阅LICENSE。