你可以把一个(单字节字符)串的作为碱-256编码的数,其中“\ X00”表示0,“”(空间,即,“\ X20”)代表32等直到“\ XFF”,它代表255
只与数字0-9的表示可以通过改变表示以基座10
注意,“base64编码”实际上不是一个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中的数字存储日志(10)/ log(2)位。无论您选择的块大小如何,您都无法将这些表示与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;
我们得到
36826012939234118013885831603834892771924668323094861
Mary had a little lamb
由于每个数字只能编码log(10)/log(2)=~3.32193
位预期数量往往是140% longer(不是200%更长的时间,如将与埃尔.pescado的回答)。
字符串只是一组映射到人类可读字符的数字。告诉我们更多关于为什么你想要做这样的事情,你可能会得到一个很好的答案。你想能够将数字转换回原始字符串吗?否则,哈希函数可能就足够了。 – 2010-06-05 21:18:52
@William在我当前的情况下,我想将包含数字和字母(内部ID,看起来丑陋)的16个字符的URL标识符转换为“仅用于数字”表示形式,以便更易于理解,用作锚点访问CMS中的不同内容块。 – 2010-06-05 21:20:05
@Pekka:你的虚构结果似乎有点乐观,不是吗?它比原始字符串短一个字符! ;-) – 2010-06-05 21:24:55