通し番号や、日付などを数字で書く場合、
100
101
なら、まだいいのですが、
100000000000
100000000001
と続き、更に、桁が大きくなると、携帯電話などで見る場合パケットが気になります。
そこで、文字を圧縮する原理を利用して、簡単に圧縮できないでしょうか?
例えば
100000000000
左(L)から1が(g)1つで(d)0が(g)8つ
L1g1d0g11
こうすると、短くないますよね。
バイナリレベルで上手に圧縮するともっと、短く正確にできるのではないかと思っています。
他にも、探して、下記のようなものも見つけたのですが、圧縮されたものを、print出力してみると、文字化けしていて使えそうにありませんでした。
何か、良い方法は無いでしょうか?
また、数字以外の文字が混じった場合でも対応できれば、更に助かります。
宜しくお願い致します。
use Compress::Zlib;
$num = compress($num);
$num = uncompress($num);
No.1ベストアンサー
- 回答日時:
圧縮のアルゴリズムは、たくさんあります。
どれを選ぶか、もしくは組み合わせるかの問題かと思います。
メジャーなところで、zipなどの圧縮を行い、base64等の符号化処理をするのが
良いのではないでしょうか。
テキストor非テキストの文字列
↓
ZIPアルゴリズムで圧縮(縮める)
↓
非テキストの文字列
↓
base64符号化(問題ある制御符号を無くすためちょっと伸ばす)
↓
テキスト文字列(7ビット文字だけの組み合わせ文字列)
ただし、アルゴリズムや符号化の方式を選び間違うと、
元の文字列より長くなることがあるので、注意してください。
例えば、256バイト以下の対象データをLZHアルゴリズムで圧縮すると、
256バイト以上の圧縮結果となります。
また、符号化方式も、識別のため前後にマジックワードが付与されたり
するので、対象データが短すぎると、大元の対象データより長くなる可能性も
あります。
なお、当然ですが、復元するのに仕組みが必要になるので、相手が携帯であれば
携帯側に、javaなどで復元処理を実装することになると思いますので、メジャーなものを
組み合わせれば、復元側も既存のモノを流用できて良いと思います。
この回答への補足
回答いただきありがとうございます。
perl入門者ですので、とりあえず、分かる範囲内でやってみました。
use Compress::Zlib;
$num = compress($num);
print $num;
print "\n<br>";
use MIME::Base64 ();
$num = MIME::Base64::encode($num);
print $num;
print "\n<br>";
$num = MIME::Base64::decode($num);
print $num;
print "\n<br>";
$num = uncompress($num);
print $num;
print "\n<br>";
としてみたのですが、
100文字を、75文字程度にすることができました。
もう少し、圧縮率を上げることはできないものでしょうかね?
また、”+=/”を含まないA-Za-z0-9のみで、Base64のような方法は無いものでしょうかね?
また、全て、サーバー側で処理して行うため(今回は、URLのみの短縮を目的)、個人の方が作成されている手法でも良いのですが、何か、良いものは無いでしょうかね?
ご存知でしたら、教えてください。
宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Malformed UTF-8 character
-
Perlで Right関数に近い処理を...
-
文字列と数字を含むセルから数...
-
Perlの正規表現でマッチする範...
-
CSVファイルの中で、「 , 」カ...
-
英数字のみ全角から半角に変換
-
EXCELからCSVにすると余計なカ...
-
Accessで日付や数値を全角で表...
-
カンマ区切りの数字をCSVフ...
-
エクセルで数値を全角文字(カ...
-
「何とかで始まり、何とかで終...
-
VBA 置換文字がみつからない時
-
住宅にカナを入力する際に丁目...
-
コマンドプロンプト 全角を含ん...
-
UWSC教えて
-
エクセルでの”々”の扱い
-
VBA 文字に半角が含まれて...
-
SQLのデータで半角カナを全角に...
-
スペースで区切られた氏名から...
-
マクロ超初心者です。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Malformed UTF-8 character
-
Perlで Right関数に近い処理を...
-
文字列と数字を含むセルから数...
-
[Perl] Pack関数について教えて...
-
GDBでデバッグするとき文字列の...
-
日本語文字列の指定長(byte)切出し
-
パイソンエラーについて
-
VBA like演算子について
-
トリッププログラム!?
-
splitの逆の処理
-
Perl(Windows)の文法について
-
メールヘッダのMIMEエンコード...
-
特定の文字列をHTMLタグに変換...
-
ASP.NETでエンコードの判定
-
perlで文字列を短く(圧縮)し...
-
正規表現での文字の抜き出し
-
cryptの使用方法
-
perlでのURL判定
-
VBS:文字列を元に外部リストか...
-
カートの送料設定を2個まで1個...
おすすめ情報