5

Redisキーはバイナリセーフです。C#を使用してバイナリをredisに入れたいです。私が選んだクライアントは、キーを使用するバイナリキーの記述をサポートしておらず、それは理にかなっています。しかし、私はただ浮気しているので、これを行う方法を教えてください。

生のbyte[]を文字列に変換するにはどうすればよいですか?最初はbyte[]をutf8文字列に変換することを考えていましたが、Unicodeには有効かどうかを確認するためのチェックがいくつかあります。したがって、生のバイナリは失敗するはずです。

実際に試してみました。失敗する代わりに、私は奇妙な結果を得ました。私の主な質問は、rawbyte[]を同等の文字列に変換するにはどうすればよいですか?のように、生のbyte []を文字列として持ち、base32 / 64 / hex/whateverとしてエンコードしません。私の重要でない質問は、これが有効なUTF8文字列ではないという例外の代わりに512バイトの文字列を取得したのはなぜですか?

コード

var rainbow = new byte[256];
for (int i = 0; i < 256; i++)
{
    rainbow[i] = (byte)i;
}
var sz = Encoding.UTF8.GetString(rainbow);
var szarr = Encoding.UTF8.GetBytes(sz);
Console.WriteLine("{0} {1} {2}", ByteArraysEqual(szarr, rainbow), szarr.Length, rainbow.Length);

出力

False 512 256

4

2 に答える 2

8

任意の byte[] がある場合、それを文字列として取得する方法は、それを 16 進数や base-64 などに変換することです。最も簡単に:

byte[] key = ...
string s = Convert.ToBase64String(key);

そして逆に:

key = Convert.FromBase64String();

System.Text.Encoding のようなものを使用するのは魅力的ですが、それは完全に間違っており、堅牢な変換を行うために使用することはできません。エンコーディングを使用する場合、次の 2 つの問題があります。

  • 多くのキーを正常にラウンドトリップできません
  • 多くの異なる byte[] キーが同じ文字列キーになる可能性があります

これはどっちもダメ!問題は、使用法が逆であることです。Encoding は、任意の文字列を構造化された byte[] との間で変換し、任意の文字列をエンコード/デコードできるようにします。Base-64 は、任意の byte[] を構造化文字列との間で変換します。非常に微妙な違いですが、非常に重要です。

于 2012-09-02T05:54:12.537 に答える
4

バイトを文字列に変換するには、何らかのエンコーディングを使用する必要があります。エンコーディングiso-8859-1で正しい結果が得られます。

var sz = Encoding.GetEncoding("iso-8859-1").GetString(rainbow);
var szarr = Encoding.GetEncoding("iso-8859-1").GetBytes(sz);
Console.WriteLine("{0} {1} {2}", ByteArraysEqual(szarr, rainbow), szarr.Length, rainbow.Length);

真 256 256

問題は、UTF8 では 1 文字につき複数のバイトが必要なことです。最初の 128 文字を 1 バイトでエンコードできます。

Console.Write(Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(new byte[] { 127 })).Length);

1

ただし、残りは 3 バイトが必要です。

Console.Write(Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(new byte[] { 128 })).Length);

3

したがって、バイト 0 ~ 255 を文字列に変換して UTF8 で戻すと、最初の 128 は 1 バイトとして返されますが、最後の 128 は 3 として返されます。128 + 3*128 = 512、したがって結果は.

ASCII は 128 を超えるバイトをどう処理するかわからないため、単に としてエンコードされ?、1 バイトとして返されます。

于 2012-09-02T03:52:42.090 に答える