Как преобразовать строку битов в байтовый массив
У меня есть строка, представляющая биты, такие как:
"0000101000010000"
Я хочу преобразовать его, чтобы получить массив байтов, таких как:
{0x0A, 0x10}
Количество байтов является переменным, но всегда будет заполнение, чтобы сформировать 8 бит на байт (таким образом, 1010 становится 000010101).
7 ответов
Используйте встроенный Convert.ToByte()
и читать кусками по 8 символов, не изобретая вещи..
Если только это не то, что должно научить вас побитовым операциям.
Обновить:
Кража у Адама (и, возможно, чрезмерное использование LINQ. Это может быть слишком лаконично, и нормальный цикл может быть лучше, в зависимости от ваших собственных (и ваших коллег!) Предпочтений):
public static byte[] GetBytes(string bitString) {
return Enumerable.Range(0, bitString.Length/8).
Select(pos => Convert.ToByte(
bitString.Substring(pos*8, 8),
2)
).ToArray();
}
Вот быстрое и простое решение (и я думаю, что оно будет соответствовать всем вашим требованиям): http://vbktech.wordpress.com/2011/07/08/c-net-converting-a-string-of-bits-to-a-byte-array/
public static byte[] GetBytes(string bitString)
{
byte[] output = new byte[bitString.Length / 8];
for (int i = 0; i < output.Length; i++)
{
for (int b = 0; b <= 7; b++)
{
output[i] |= (byte)((bitString[i * 8 + b] == '1' ? 1 : 0) << (7 - b));
}
}
return output;
}
Получите characers в группах по восемь и проанализируйте байт:
string bits = "0000101000010000";
byte[] data =
Regex.Matches(bits, ".{8}").Cast<Match>()
.Select(m => Convert.ToByte(m.Groups[0].Value, 2))
.ToArray();
Это должно привести вас к ответу: как я могу преобразовать биты в байты?
Вы можете просто преобразовать вашу строку в массив, как в этой статье, и использовать ту же логику для выполнения преобразования.
private static byte[] GetBytes(string bitString)
{
byte[] result = Enumerable.Range(0, bitString.Length / 8).
Select(pos => Convert.ToByte(
bitString.Substring(pos * 8, 8),
2)
).ToArray();
List<byte> mahByteArray = new List<byte>();
for (int i = result.Length - 1; i >= 0; i--)
{
mahByteArray.Add(result[i]);
}
return mahByteArray.ToArray();
}
private static String ToBitString(BitArray bits)
{
var sb = new StringBuilder();
for (int i = bits.Count - 1; i >= 0; i--)
{
char c = bits[i] ? '1' : '0';
sb.Append(c);
}
return sb.ToString();
}
Вы можете пойти любой из нижеперечисленных,
byte []bytes = System.Text.Encoding.UTF8.GetBytes("Hi");
string str = System.Text.Encoding.UTF8.GetString(bytes);
byte []bytesNew = System.Convert.FromBase64String ("Hello!");
string strNew = System.Convert.ToBase64String(bytesNew);