2017-01-21 10 views
3

У меня есть строка двоичного числа Как temp = "0101110011" И я хочу сохранить это как файл Этот Temp имеет 10 символов и как я могу сохранить эту строку В файл с 10 Бит Длина?Как написать строку из двоичного файла в файл C#

void Save_Data(string temp) 
{ 
    bool[] BoolArray = new bool[temp.Length]; 
    BitArray Barray = new BitArray(BoolArray.Length); 
    char[] ch = temp.ToCharArray(); 

    for (int i = 0; i < temp.Length; i++) 
    { 
     if (ch[i] == '0') 
     { 
      Barray[i] = false; 
     } 
     else 
     { 
      Barray[i] = true; 
     } 
    } 

    Stream stream = new FileStream("D:\\test.dat", FileMode.Create); 
    StreamWriter sw = new StreamWriter(stream); 

    foreach (bool bit in Barray) 
    { 
     sw.Write(bit ? 1 : 0); 
    } 

    sw.Flush(); 
    sw.Close(); 
} 

С помощью этого кода Моя длина файла

+0

Вы хотите, чтобы файл с текстом '0101110011' с размером 10 бит? –

+0

@ Roma Нет, я хочу сохранить это как .data – InvBoy

+0

Вы ожидаете, что сохранение «10101010» в файл будет производить в конце 1-байтовый файл размера? –

ответ

4

Ваш размер файла 80 Bit будет 2 байта (16 бит). Вы не можете иметь файл размером 10 бит (всего 8, 16, 24, 32, 40 ...). На диске размер, выделенный для файла, может быть меньше размера кластера. Если размер кластера на диске составляет 4096 байт, а размер файла меньше размера кластера, файловая система будет выделять память размера кластера.

Размеры указаны в байтах, поэтому, если у вас есть строка "00101" (5 бит) в представлении байтов, она будет 00000101 (8 бит).

В вашем случае YOR строка "0101110011" (12 бит) - это два байта:

  1. "01" в строку, которая будет 00000001 в представлении байт

  2. "01110011" в строку, которая будет 01110011 в байте

Secon d string имеет длину 8, поэтому байт будет выглядеть как эта строка.

Ваша строка начинается с '0', но вы можете опустить '0', так как они не полезны в начале. Это означает, что в байтах значения 01110011 и 1110011 одинаковы.

Hepler:

byte[] StringToBytesArray(string str) 
{ 
    var bitsToPad = 8 - str.Length % 8; 

    if (bitsToPad != 8) 
    { 
     var neededLength = bitsToPad + str.Length; 
     str = str.PadLeft(neededLength, '0'); 
    } 

    int size= str.Length/8; 
    byte[] arr = new byte[size]; 

    for (int a = 0; a < size; a++) 
    { 
     arr[a] = Convert.ToByte(str.Substring(a * 8, 8), 2); 
    } 

    return arr; 
} 

Кроме того, вы должны использовать BinaryWriter вместо StreamWriter:

string str = "0101110011"; 
byte[] arr = StringToBytesArray(str); 

Stream stream = new FileStream("D:\\test.dat", FileMode.Create); 
BinaryWriter bw = new BinaryWriter(stream); 

foreach (var b in arr) 
{ 
    bw.Write(b); 
} 

bw.Flush(); 
bw.Close(); 

Кроме того, этот пример работает для различных длин строк.

После считывания значения из вашего файла вы получите 2 байта, которые затем конвертируете в string. Но строка из этих байтов будет "0000000101110011" (с ненужным '0' в начале).

Чтобы получить строку, которая начинается от '1':

string withoutZeroes = 
     withZeroes.Substring(withZeroes.IndexOf('1'), str.Length - withZeroes.IndexOf('1')); 

После всех операций (с строкой "0101110011") ваш файл будет иметь размер 2 байта (16 бит), но файловая система выделяет больше памяти для нее (размера выделено память будет эквивалентна размеру кластера).

0

длина вашей строки (которая представляет 10 бит) двоичных чисел равна 10, а наименьший тип данных - байтовый (8 бит). Ваши данные будут вписываться в два байта, так как @Roma предложили.

Но здесь приходит проблема

ваша строка "0101110011"

и после его решения вы будете иметь два байта, как следовать

00000001 и 01110011

так, получая их от файл и объединить их вместе, у вас будет строка длиной 16 "0000000101110011"

который не является вашей точной строкой.

Итак, вы должны ввести один служебный заголовок, который будет содержать длину входной строки в последнем байте.

{ 
    Byte length //here 2 
     Byte[] dataInBytes //here two byte 00000001 and 01110011 
}