Я не уверен, что ASCIIEncoding.GetBytes собирается это сделать, потому что он поддерживает только range 0x0000 to 0x007F.
Вы говорите, что строка содержит только байты. Но строка .NET представляет собой массив символов, а 1 char - 2 байта (поскольку .NET хранит строки как UTF16). Таким образом, вы можете иметь две ситуации для хранения байта 0x42 и 0x98:
- Строка была строка ANSI и содержит байты и преобразуется в строку Юникода, таким образом, байты будут 0x00 0x42 0x00 0x98. (Строка сохраняется как 0x0042 и 0x0098)
- Строка представляла собой только массив байтов, который вы приписывали или просто получали строку, и таким образом стали следующими байтами 0x42 0x98. (Строка сохраняется как 0x9842)
В первой ситуации на результат будет 0x42 и 0x3F (ascii для «B?»). Вторая ситуация привела бы к 0x3F (ascii для «?»). Это логично, потому что символы находятся за пределами допустимого диапазона ascii, и кодер не знает, что делать с этими значениями.
Так что мне интересно, почему это строка с байтами?
- Возможно, он содержит байт, закодированный как строка (например, Base64)?
- Возможно, вам стоит начать с массива символов или массива байтов?
Если у вас действительно есть ситуация 2, и вы хотите получить из нее байты, вы должны использовать вызов UnicodeEncoding.GetBytes. Потому что это вернет 0x42 и 0x98.
Если вы хотите перейти от массива символов к массиву байтов, самым быстрым способом будет Marshaling. Но это не очень приятно и использует двойную память.
public Byte[] ConvertToBytes(Char[] source)
{
Byte[] result = new Byte[source.Length * sizeof(Char)];
IntPtr tempBuffer = Marshal.AllocHGlobal(result.Length);
try
{
Marshal.Copy(source, 0, tempBuffer, source.Length);
Marshal.Copy(tempBuffer, result, 0, result.Length);
}
finally
{
Marshal.FreeHGlobal(tempBuffer);
}
return result;
}
Строка содержит только двоичные данные? Что это значит? В нем есть только «1» и «0»? – 2008-09-16 13:47:12