2017-01-21 5 views
3

J'ai une chaîne de nombre binaire comme temp = "0101110011" Et je veux enregistrer en tant que fichier cette température ont 10 caractères et comment puis-je enregistrer cette chaîne de fichiers Avec 10 Longueur de bit?Comment écrire une chaîne de binaire dans le fichier 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(); 
} 

avec ce code Ma longueur du fichier est de 80 bits

+0

Voulez-vous un fichier avec le texte '0101110011' avec la taille 10 bits? –

+0

@Roma Non Je veux enregistrer que .data – InvBoy

+0

pensez-vous que l'enregistrement "10101010" dans un fichier produira à la fin 1 fichier de taille d'octet ?? –

Répondre

4

Votre taille du fichier sera de 2 octets (16 bits). Vous ne pouvez pas avoir de fichier de taille 10 bits (seulement 8, 16, 24, 32, 40 ...). Sur disque, la taille allouée pour le fichier peut être aussi petite que la taille du cluster. Si la taille du cluster sur le disque est de 4096 octets et que la taille du fichier est inférieure à la taille du cluster, le système de fichiers allouera la mémoire de la taille du cluster.

Les tailles sont en octets, donc si vous avez la chaîne "00101" (5 bits) en représentation octet, ce sera 00000101 (8 bits).

Dans votre cas yor chaîne est "0101110011" (12 bits) - il est deux octets:

  1. "01" dans la chaîne qui sera 00000001 dans la représentation des octets

  2. "01110011" dans la chaîne qui sera 01110011 dans l'octet représentation

Secon La chaîne d a une longueur de 8 donc l'octet ressemblera à cette chaîne.

Votre chaîne commence à '0' mais vous pouvez omettre '0' ils sont inutilisables au début. Cela signifie que dans les valeurs de représentation octet 01110011 et 1110011 sont les mêmes.

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; 
} 

En outre, vous devez utiliser BinaryWriter au lieu de 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(); 

En outre, cet exemple fonctionne pour différentes longueurs de chaîne. Après avoir lu la valeur de votre fichier, vous obtiendrez 2 octets que vous convertirez en string. Mais la chaîne de ces octets sera "0000000101110011" (avec '0' inutile au début).

Pour obtenir la chaîne qui commence à partir '1':

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

Après toutes les opérations (avec chaîne "0101110011") votre fichier aura la taille 2 octets (16 bits), mais le système de fichiers alloue plus de mémoire pour elle (taille allouée la mémoire sera équivalente à la taille du cluster).

0

la longueur de votre chaîne (qui représente 10 bits) de nombres binaires est 10 et le plus petit type de données est octet (8 bits). vos données seraient en forme dans deux octets comme @Roma ont suggéré.

Mais voici problème

votre chaîne est "0101110011"

et après sa solution, vous aurez deux octets comme suivre

00000001 et 01110011

donc en les revenir de fichier et en les fusionnant, vous aurez une chaîne de 16 longueur "0000000101110011"

qui n'est pas votre chaîne exacte.

Vous devrez donc introduire un préfixe, un en-tête qui contiendra la longueur de la chaîne d'entrée dans le dernier octet.

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