Bạn có thể nghĩ đến một (byte ký tự đơn) chuỗi như một số cơ sở-256 mã hóa nơi "\ x00" đại diện cho 0, '' (không gian, tức là, "\ x20") đại diện cho 32 và vân vân cho đến khi "\ xff", đại diện cho 255.
một biểu diễn chỉ với những con số 0-9 có thể được thực hiện đơn giản bằng cách thay đổi các đại diện đến căn 10
Lưu ý rằng "mã hóa base64" không phải là thực sự là một base conversion. base64 ngắt đầu vào thành các nhóm 3 byte (24 bit) và thực hiện chuyển đổi cơ sở trên các nhóm riêng lẻ. Điều này hoạt động tốt vì một số có 24 bit có thể được biểu diễn bằng bốn chữ số trong cơ số 64 (2^24 = 64^4).
Điều này nhiều hay ít những gì el.pescado thực hiện - anh chia dữ liệu đầu vào thành các phần 8 bit và sau đó chuyển số thành cơ số 10. Tuy nhiên, kỹ thuật này có một bất lợi tương đối với mã hóa 64 cơ sở - nó không căn chỉnh chính xác với ranh giới byte. Để biểu diễn một số có 8 bit (0-255 khi không dấu), chúng ta cần ba chữ số trong cơ sở 10. Tuy nhiên, chữ số ngoài cùng bên trái có ít thông tin hơn các số khác. Nó có thể là 0, 1 hoặc 2 (cho số chưa ký).
Một chữ số trong cơ sở 10 lưu trữ nhật ký (10)/log (2) bit. Không có vấn đề kích thước chunk bạn chọn, bạn sẽ không bao giờ có thể sắp xếp các đại diện với 8-bit byte (theo nghĩa là "sắp xếp" tôi đã mô tả trong đoạn trước).Do đó, đại diện nhỏ gọn nhất là một chuyển đổi cơ sở (mà bạn có thể thấy như thể nó là một "mã hóa cơ sở" chỉ với một đoạn lớn).
Dưới đây là ví dụ với 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;
}
Đối
$string = "Mary had a little lamb";
$base10 = base256ToBase10($string);
echo $base10,"\n";
$base256 = base10ToBase256($base10);
echo $base256;
chúng tôi nhận
36826012939234118013885831603834892771924668323094861
Mary had a little lamb
Vì mỗi chữ số mã hóa chỉ log(10)/log(2)=~3.32193
bit mong đợi con số này sẽ có xu hướng 140% longer (không 200% lâu hơn, như sẽ là với el câu trả lời của .pescado).
Chuỗi chỉ là một tập hợp các con số ánh xạ tới các ký tự có thể đọc được của con người. Hãy cho chúng tôi biết thêm một chút về lý do bạn muốn làm điều gì đó như thế này và bạn có thể nhận được câu trả lời hay. Bạn có muốn để có thể chuyển đổi số trở lại chuỗi gốc không? Nếu không, chức năng Hashing có thể sẽ đủ. –
@William trong trường hợp hiện tại của tôi, tôi muốn chuyển đổi số nhận dạng URL gồm 16 ký tự bao gồm số và chữ cái (ID nội bộ, trông xấu xí) thành biểu diễn "số duy nhất" để giúp mắt dễ dàng hơn, để sử dụng làm neo để truy cập các khối nội dung khác nhau trong CMS. –
@Pekka: Kết quả hư cấu của bạn có vẻ hơi lạc quan, phải không? Đó là một ký tự ngắn hơn chuỗi gốc! ;-) –