1

より読みやすく、コピー/貼り付け可能なものに変換したいバイナリ データがあります。

バイナリデータは次のように表示されます

?Q?O?,???W%ʐ):?g????????

これはかなり醜いです。私はそれを16進数に変換できます:

value.unpack("H*").first

しかし、16 進数は 16 文字しかないため、あまり圧縮されていません。数百文字の長さの文字列になってしまいます。

可能な値を最大限に活用するために、文字 (大文字と小文字)、数字、および基本的な記号を使用する形式をお勧めします。何を使用できますか?

また、別のライブラリを必要としない、Ruby に組み込まれているものも好みます。残念ながら、それが本当によく知られていて人気があるか、理想的には Ruby に組み込まれていない限り、別のライブラリを要求することはできません。

http://apidock.com/ruby/String/unpackのものを試してみましたが、何も見つかりませんでした。

4

3 に答える 3

2

簡単な方法では、Base64 エンコーディングを使用して値をエンコードします。これは、16 進エンコーディング (Base16) に非常に似ていますが、より長い辞書を使用します。

Base64 文字列は、適切に準備された場合、印刷可能な文字のみを含みます。これは、コピー/貼り付けと共有の利点です。

2 つ目の利点は、エンコード率が 3:4 であることです。これは、適度に効率的であることを意味します。3:4 のエンコード比は、入力の 3 バイトごとに、エンコードに 4 バイトが使用されることを意味します (75% 効率)。16 進エンコーディングは効率の低い 1:2 エンコーディング比です。つまり、入力の 1 バイトごとに 2 バイトを使用してエンコードします (50% 効率)。

Ruby 標準ライブラリのBase64実装を使用して、次のようにエンコードおよびデコードできます。

require "base64"

encoded = Base64.encode64("Taste the thunder!") # <== "VGFzdGUgdGhlIHRodW5kZXIh\n"
decoded = Base64.decode64(encoded)              # <== "Taste the thunder!"

(ほとんど) URL セーフ バージョンもあることに注意してください。これにより、追加の URL エンコードを必要とせずに、エンコードされた値を URL のどこにでも含めることができます。これにより、URL 内の情報を不明瞭な方法で渡すことができます。特に、通常はその方法では簡単に渡されない情報を渡すことができます。

これを試してデータをエンコードしてください:

encoded_url_param = Base64.urlsafe_encode64("cake+pie=yummy!")  # <== "Y2FrZStwaWU9eXVtbXkh"
decoded_url_param = Base64.urlsafe_decode64(encoded_url_param)  # <== "cake+pie=yummy!"

URL で Base64 を使用することは、実際には「セキュリティ」ではありませんが、データと意図から目を離さないようにするのに役立ちます。URL で Base64 値を使用することの唯一の潜在的な欠点は、URL で大文字と小文字を区別する必要があり、一部のアプリケーションではその要件が守られないことです。詳細については、URL は大文字と小文字を区別する必要があるSO の質問を参照してください。

于 2016-05-05T08:22:48.050 に答える
1

base 64 が必要なように思えます。これは標準ライブラリの一部です。

require 'base64'
Base64.encode64(some_data)

またはパックを使用して、

[some_data].pack("m")

結果のデータは、入力のサイズの約 4/3 になります。

于 2016-05-05T08:26:04.610 に答える
1

Base36 文字列エンコーディングは、Base64 エンコーディングと Hex エンコーディングの両方に代わる合理的な方法でもあります。このエンコーディング方式では、通常は ASCII 小文字と ASCII 数字の 36 文字のみが使用されます。

これを具体的に行う Ruby API はありませんが、この SO answer Base36 Encode a Stringは、Ruby でこれを効率的に行う方法を示しています。

Base36 へのエンコード:

encoded = data.unpack('H*')[0].to_i(16).to_s(36)

Base36 からのデコード:

decoded = [encoded.to_i(36).to_s(16)].pack 'H*'

Base36 エンコーディングは、Base64 と同様に URL で使用すると適切に機能しますが、Base64 の大文字と小文字の区別の問題には敏感ではありません。

Base36 文字列エンコーディングを、整数値を対応する base 36 エンコーディングに単純に変換する base 36 基数整数エンコーディングと混同しないでください。整数の手法では、String#to_i(36)Fixnum#to_s(36)を使用して目的を達成します。

于 2016-05-05T08:43:26.893 に答える