JustinStolle의 편집 내용 수정 (Eran Yogev의 BlockCopy 사용).
제안 된 솔루션은 실제로 인코딩을 사용하는 것보다 빠릅니다. 문제는 길이가 고르지 않은 바이트 배열을 인코딩하는 데 작동하지 않는다는 것입니다. 주어진대로, 범위를 벗어난 예외가 발생합니다. 길이를 1 씩 늘리면 문자열에서 디코딩 할 때 후행 바이트가 남습니다.
나에게 인코딩해야 할 때가 필요 DataTable
했습니다 JSON
. 이진 필드를 문자열로 인코딩하고 문자열에서로 다시 디코딩하는 방법을 찾고있었습니다 byte[]
.
따라서 두 가지 클래스를 만들었습니다. 하나는 위의 솔루션을 래핑하는 것 (문자열에서 인코딩 할 때 길이는 항상 균일하므로)과 다른 하나는 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[]
먼저 캐스팅 해보십시오