比较来自世界各地的卖家的域名和 IT 服务价格

将字节数据编码为数字

是否存在编码和解码任意数据的一般方法,使得编码的最终结果仅由数字组成 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 encoding" 并不真地
http://en.wikipedia.org/wiki/Base_conversion
. base64 将输入缩小到组 3 字节 /24 比特/ 并单独对这些组执行基本转换。 它适用于数字 24 位可以在数据库中的四位数字表示 64 /2^24 = 64^4/.

这或多或少地使el.pescado - 它将输入部分打破到8位部分,然后将数字转换为基础 10. 然而,与编码相比,该方法具有一个缺点 base 64 – 它与字节的边框不正确地对齐。 介绍数字 8 比特 /0-255, 没有标志/, 我们需要数据库中的三位数 10. 但是,最左边的数字包含比其余更少的信息。 它可以是 0, 1, 或者 2 /对于未签名的数字/.

底座中的数字 10 存储位 log/10//log/2/. 无论您选择哪种块大小,您都将永远无法将演示与8位字节保持一致 /按照 "aligning", 我在前一段中描述的/. 因此,最紧凑的表示是基本转换 /你可以看到它是如何的 "base encoding" 只有一个大片/.

这是一个例子S.
http://php.net/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;


我们得到了

36826012939234118013885831603834892771924668323094861
Mary had a little lamb
由于每个数字仅编码
log/10//log/2/=~3.32193

位,期望数字倾向于
http://www.wolframalpha.com/in ... %2529
/但不是 200% 比答案更长 el.pescado's/.

小明明

赞同来自:

好吧,它将编码 "base 8", 而不是基地 64. 最好知道八月。

一切都是什么 Base64, - 这将位流转换为6位块 /0-63/ 并从64个字符集中分配一个字符。 八万使用 3 比特, 0-7. 所以,他 COULD 用途 ABCDEFGH, 而是使用 0-7. 你不能 /容易地/ 使用 0-9, 因为0-9达到了 4 有点但不是完全 4 少量。 这就是使其成为二进制数据的糟糕编码的原因。

八刀丁二

赞同来自:

非常简单的例子 - 它表示3位数十进制的形式的每个输入字节:


function data2numbers /$data/ {
$out = "";
for /$i = 0; $i < strlen /$data/; $i++/ {
$out .= sprintf /"d", ord /$data[$i]//;
}
return $out;
}


缺点是它将所有输入数据的大小重叠 /每个输入字节由三个输出字节表示。/.

解码功能留下作为读者的练习;/

知食

赞同来自:

无论您如何编码,您将始终返回较小的基础。 也许您可以使用一些转换减少结果整数 dechex//, 但最终,您只会保存几个字符。 但是,当您开始代表多字节字符时,该数字在此时刻就会增加 0-9.

我不得不想知道是否会有没有整数,如 IDs, 目前的单词或全线,提供较小的轨道。 不完全直接编码,但相当可行的选择。

@el.pescado 上半场获得贷款,但他真的挑战了读者。 所以,我回答了 /主要是因为我想了解发生了什么/.


[code]function pekka_encode/$s/ {
$out = '';
for /$i=0;$i<strlen $i="0;$i&lt;strlen/$s/;$i+=3/" $i++="" $out="" $out;="" $s="" $s[$i]="" .="chr/$s[$i].$s[$i+1].$s[$i+2]/;" ;="" <="" code]="" div="" for="" function="" ord="" pekka_decode="" return="" {="" }="" }[="">
</strlen>

要回复问题请先登录注册