gpt4 book ai didi

php - 将字节数据编码成数字

转载 作者:可可西里 更新时间:2023-10-31 23:03:15 24 4
gpt4 key购买 nike

是否有一种通用方法来编码和解码任意数据,以便编码的最终结果仅包含数字 - 像 base64_encode 但没有字母?

虚构的例子:

$encoded = numbers_encode("Mary had a little lamb");

echo $encoded; // outputs e.g. 12238433742239423742322 (fictitious result)

$decoded = numbers_decode("12238433742239423742322");

echo $decoded; // outputs "Mary had a little lamb"

最佳答案

您可以将(单字节字符)字符串视为 base-256 编码的数字,其中“\x00”代表 0,' '(空格,即“\x20”)代表 32 等等,直到“\xFF” ",表示 255。

只用数字 0-9 表示可以简单地通过将表示更改为基数 10 来完成。

请注意,“base64 编码”实际上不是 base conversion . base64 将输入分成 3 个字节(24 位)的组,并分别对这些组进行基本转换。这很有效,因为 24 位的数字可以用 base 64 中的四位数字表示 (2^24 = 64^4)。

这或多或少是el.pescado确实如此——他将输入数据分成 8 位 block ,然后将数字转换为 10 进制。但是,这种技术相对于 64 位编码有一个缺点——它不能与字节边界正确对齐。要用 8 位(无符号时为 0-255)表示一个数字,我们需要以 10 为基数的三个数字。但是,最左边的数字比其他数字包含的信息少。它可以是 0、1 或 2(对于无符号数)。

以 10 为基数的数字存储 log(10)/log(2) 位。无论您选择的 block 大小如何,您永远无法将表示与 8 位字节对齐(就我在前一段中描述的“对齐”而言)。因此,最紧凑的表示是基本转换(您可以将其视为只有一大块的“基本编码”)。

这是一个 bcmath 的例子.

bcscale(0);
function base256ToBase10(string $string) {
//argument is little-endian
$result = "0";
for ($i = strlen($string)-1; $i >= 0; $i--) {
$result = bcadd($result,
bcmul(ord($string[$i]), bcpow(256, $i)));
}
return $result;
}
function base10ToBase256(string $number) {
$result = "";
$n = $number;
do {
$remainder = bcmod($n, 256);
$n = bcdiv($n, 256);
$result .= chr($remainder);
} while ($n > 0);

return $result;
}

为了

$string = "Mary had a little lamb";
$base10 = base256ToBase10($string);
echo $base10,"\n";
$base256 = base10ToBase256($base10);
echo $base256;

我们得到

36826012939234118013885831603834892771924668323094861Mary had a little lamb

由于每个数字仅编码 log(10)/log(2)=~3.32193 位,因此预计数字往往是 140% longer (不像 el.pescado 的回答那样长 200%)。

关于php - 将字节数据编码成数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2982112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com