web-dev-qa-db-ja.com

16進数をASCII文字に変換する

16進文字のシーケンス(0-9A-F)を0-9a-zA-Z文字のシーケンスで表すことは可能ですか?その結果、結果のシーケンスはより小さくなり、デコードできますか?

例えば:

$hex = '5d41402abc4b2a76b9719d911017c592';
echo $string = encode($hex); // someASCIIletters123
echo decode(string) == $hex; //true
12
Dziamid

関数base_convert_arbitraryを使用して、私が提示したソリューションを簡単に適応させることができます ここ

編集:私は十分に注意深く読んでいませんでした:)ベース16からベース62は、上記のように、まだ非常に実行可能です。

実際の動作を参照

6
Jon

私はあなたがこれを探していると思います:

function hex2str($hex) {
    $str = '';
    for($i=0;$i<strlen($hex);$i+=2) $str .= chr(hexdec(substr($hex,$i,2)));
    return $str;
}

http://www.linux-support.com/cms/php-convert-hex-strings-to-ascii-strings/ から)(このjavascriptツールのように機能します: http ://www.dolcevie.com/js/converter.html

22
Andrew

16進数の文字列を実際の16進値に変換したいということですか?

$hex_string = "A1B2C3D4F5"; // 10 chars/bytes
$packed_string = pack('H*', $hex_string); // 0xA1B2C3D4F5 // 5 chars/bytes.
16
Marc B

ええと、何かsimilar、はい... 16進文字をバイナリ値として解析してから、base64に変換します。これは、0-9 a-z A-Zより少し大きいlittleビットを使用しますが、それよりも数文字しか使用しません。 62文字に加えて他の3文字を使用しても大丈夫ですか? base64_encode エンコードを実行する場合。

(代わりにbase32に変換することもできますが、それほどコンパクトではありません。2の累乗ではないベースに変換することも可能ですが、魅力的ではありません。)

入力シーケンスの文字数が奇数の場合は、最後のハーフバイトを表す何らかの方法も必要になります。 pack を呼び出して元の解析を行う前に、そのことを検討することをお勧めします。

2
Jon Skeet