1

これが私がやろうとしていることです。key(たとえばkey1)を使用してRedisに保存する必要のあるbyte[]があります。Redisはそれを文字列として保存します。key1を介して値を取得するときにbyte[]を再構築する必要があります

    //here is a byte array
    byte[] bArr = new byte[] {83, 71, 86, 115, 98, 71, 56, 103, 84, 88, 73, 117, 73, 69, 104, 118, 100, 121, 66, 107, 98, 121, 66, 53, 98, 51, 85, 103, 90, 71, 56, 47}; //"Hello World"; 

    // I will have to store this as a byte string into redis
    //Base64 encoding
    bArr = Base64.encodeBase64(bArr);
    String storeStr = Arrays.toString(bArr) ;
    // storeStr is what gets stored in redis
    System.out.println("storeStr>>" + storeStr+ "<<");
    // I will get this string back from redis
    // now trying to reconstruct the byte[]
    byte[] aArr = Base64.decodeBase64(storeStr); 
    System.out.println("readStr>>" + Arrays.toString(aArr)+ "<<");  

しかし、次の出力が得られます。

storeStr >> [85、48、100、87、99、50、74、72、79、71、100、85、87、69、108、49、83、85、86、111、100、109、82、 53、81、109、116、105、101、85、73、49、89、106、78、86、90、49、112、72、79、67、56、61] << readStr >> [-13 、-98、60、-41、77、60、-17、-33、121、-45、-66、59、-37、-65、123、-41、93、52、-13、-97、 59、-21、-35、116、-13、-113、124、-33、-50、124、-21、93、117、-41、77、53、-45、-33、54、-25 、127、53、-41、79、117、-41、-83、116、-25、93、53、-13、-98、-9、-29、-33、61、-41、78、- 69、-13、-50、-67、-45、-113、117、-41、110、-10、-17、-34、-69、-25、-82、-75] <<

私は何が間違っているのですか?これに対するより良い解決策はありますか?

4

5 に答える 5

6

Arrays.toString()バイト配列を文字列に変換しません。デバッグの目的で、バイト配列の文字列表現を提供しList<Byte>.toString()ます。

Base64.encode()バイト配列を文字列に変換する必要があります。またBase64.decode()、base64文字列を対応するバイト配列に変換する必要があります。私が見たすべてのBase64ライブラリには、そのようなメソッドが組み込まれています。あなたもおそらく1つ持っています。そうでない場合は、ASCII文字を含むBase64を使用できます。

String storeStr = new String(base64Array, "ASCII");

byte[] bytes = storeStr.getBytes("ASCII");
于 2013-02-28T22:22:46.840 に答える
2

使用しているbase64エンコーダーはわかりませんが、base64を使用してバイト配列をエンコードした結果はすでに...になっStringているはずです。同様に、デコードすると、がに変換Stringされbyte[]ます。残念ながら、一部のbase64 APIは、その面でひどくうまく設計されていません-

より賢明なAPIを備えたこのパブリックドメインライブラリをご覧になることをお勧めします。

byte[] binary = ...;
String encoded = Base64.encodeBytes(binary);

// Send encoded to Redis...

byte[] decoded = Base64.decode(encoded);
于 2013-02-28T22:19:55.573 に答える
1

コンストラクターを使用して、byte[]から文字列を作成できます。

//assuming you have a byte[] bytes
String string = new String(bytes);

次に、次のように書き戻します。

byte[] bytes = string.getBytes();
于 2013-02-28T22:49:02.777 に答える
1

Base 64は、基数が64(64の可能な値)であるため、このように呼ばれることを忘れないでください。つまり、各文字は2 ^ 6、つまり6ビットです。Redisはバイナリセーフ文字列をサポートしているため、印刷されない文字でも使用できます。64のきれいな印刷、Webセーフ文字に制限する理由はありません(人々がB64を使用する理由)。

もう1つの問題は、ASCIIはです0-127が、バイトは-128 to 127であるため、直接マップすることはできず、範囲の半分が失われます(2^8対2^7)。UTF-8を使用すると、これらすべてのビットが取得されるため、2 ^ 8または基数256になります。その結果、1バイトを1.25 B64文字、または1つのUTF-8文字に詰め込むことができます。したがって、UTF-8エンコードは、スペースの約75%をB64エンコードデータとして使用します。=以下では、 B64が使用するすべての余分なパディング文字により、それよりも優れています。

例、19バイトのエンコード:

B64文字列:28文字

UTF8文字列:19文字(32%節約!)

// setup
byte[] bytes = new byte[]{-10, 1, 3, 85, 48, 100, 87, 99, 050, 74, 79, 71, 100, 85, 87, -120, 108, -128, 30};

// full UTF-8 range
String outFullRange = new String(bytes, "UTF-8");
System.out.println(outFullRange); // prints �U0dWc(JOGdUW�l�

// just Base64
String outB64 = Base64.encode(bytes);
System.out.println(outB64);// 9gEDVTBkV2MoSk9HZFVXiGyAHg==

Redisはメモリ内にあり、メモリは貴重であるため、アプリがいっぱいになり始めたら、バイナリデータをUTF-8エンコーディングに切り替えて、スペースをすばやく節約することをお勧めします。欠点は、B64ほど人間が読めないことです。

于 2015-03-25T16:01:08.387 に答える
0

これらの2つの関数を使用して、変換および変換し直します

Convert.ToBase64String(en)

Convert.FromBase64String(input)

バイトと文字列の間のリンクをブリッジします。また、データの追加や損失がないことを確認します。特殊な文字列です。

https://en.wikipedia.org/wiki/Base64

于 2016-05-31T05:27:23.173 に答える