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:
"01"
dans la chaîne qui sera 00000001
dans la représentation des octets
"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).
Voulez-vous un fichier avec le texte '0101110011' avec la taille 10 bits? –
@Roma Non Je veux enregistrer que .data – InvBoy
pensez-vous que l'enregistrement "10101010" dans un fichier produira à la fin 1 fichier de taille d'octet ?? –