ocubom/base-convert

在任意进制之间安全地进行数字转换。

v2.0.3 2023-12-06 11:12 UTC

This package is auto-updated.

Last update: 2024-09-06 13:00:09 UTC


README

大数字进制转换

在任意进制之间安全地进行数字转换。

Contributors Forks Stargazers Issues License Version CI Code Quality Coverage

探索文档

报告错误 · 请求功能

内容

关于Base Convert

Base Convert 在任意进制之间安全地进行数字转换。转换通过自定义实现进行,以避免原生PHP base_convert 函数 浮点精度问题

使用的实现是从 Symfony UID 组件 中提取的。类 BinaryUtil 实现了必要的 fromBasetoBase 方法。这些方法已被提取以确保兼容性(它是一个内部类)并降低最低PHP版本要求。

入门

安装

请确保已全局安装 Composer,如 Composer 文档的 安装章节 中所述。

$ composer require ocubom/base-convert

用法

就像使用原生的 base_convert 一样。尽管实现与原生转换兼容,但它提供了一些改进

  • 进制范围在2到62之间。原生版本仅支持2到36之间的进制。

    转换使用与 GMP 扩展 相同的方式使用 Base62。转换是兼容的。

  • 支持“命名进制”。

  • 可以使用特殊进制 bin 来转换二进制字符串。这可以直接转换某些函数的二进制输出。

    use function \Ocubom\Math\base_convert;
    
    $hex = base_convert(random_bytes(32), 'bin', 'hex');

    警告

    不要将二进制编码(bin)与Base2编码(包含字符01的文本字符串)混淆。

    在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 类的 encodedecode 方法。

    use Ocubom\Math\Crockford;
    
    // Encoding
    $crockford = Crockford::encode(random_bytes(32), 'bin');
    
    // Decoding
    $hex = Crockford::decode($crockford, 'hex');
  • 使用 crockford_encodecrockford_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');

路线图

请参阅开放问题,以获取完整的功能提议(以及已知问题)列表。

贡献

贡献使得开源社区成为一个如此惊人的学习、灵感和创造的地方。您做出的任何贡献都将被非常感谢。

如果您有改进此项目的建议,请克隆仓库并创建一个拉取请求。您也可以简单地打开一个带有“增强”标签的问题。

  1. 克隆项目。
  2. 创建您的功能分支(git checkout -b feature/your-feature)。
  3. 提交您的更改(git commit -m 'Add your-feature')。
  4. 推送到分支(git push origin feature/your-feature)。
  5. 打开一个拉取请求。

作者

请参阅参与此项目的贡献者列表

许可

在 MIT 许可证下分发。有关更多信息,请参阅LICENSE