JustinStolleの編集の改良(Eran YogevによるBlockCopyの使用)。
提案されたソリューションは、実際にエンコーディングを使用するよりも高速です。問題は、長さが不均一なバイト配列のエンコードでは機能しないことです。与えられたように、それは範囲外の例外を発生させます。文字列からデコードするとき、長さを1増やすと、後続のバイトが残ります。
私にとって、からにエンコードしたいときに必要になりましDataTable
たJSON
。バイナリフィールドを文字列にエンコードし、文字列からにデコードする方法を探していましたbyte[]
。
したがって、2つのクラスを作成しました。1つは上記のソリューションをラップするクラス(文字列からエンコードする場合は長さが常に均一であるため問題ありません)ともう1つはbyte[]
エンコードを処理するクラスです。
バイナリ配列の元の長さが奇数( '1')であるか偶数( '0')であるかを通知する単一の文字を追加することにより、不均一な長さの問題を解決しました
次のように:
public static class StringEncoder
{
static byte[] EncodeToBytes(string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
static string DecodeToString(byte[] bytes)
{
char[] chars = new char[bytes.Length / sizeof(char)];
System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
return new string(chars);
}
}
public static class BytesEncoder
{
public static string EncodeToString(byte[] bytes)
{
bool even = (bytes.Length % 2 == 0);
char[] chars = new char[1 + bytes.Length / sizeof(char) + (even ? 0 : 1)];
chars[0] = (even ? '0' : '1');
System.Buffer.BlockCopy(bytes, 0, chars, 2, bytes.Length);
return new string(chars);
}
public static byte[] DecodeToBytes(string str)
{
bool even = str[0] == '0';
byte[] bytes = new byte[(str.Length - 1) * sizeof(char) + (even ? 0 : -1)];
char[] chars = str.ToCharArray();
System.Buffer.BlockCopy(chars, 2, bytes, 0, bytes.Length);
return bytes;
}
}
searchResult.Properties["user"][0]
何ですか?byte[]
最初にキャストしてみてください