2017-01-21 66 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(); 
} 

与此代码我的文件长度为80位的

+0

你想要文件大小为10位的文本'0101110011'吗? –

+0

@Roma否我想保存为.data – InvBoy

+0

您是否期望将“10101010”保存到文件中会在最后产生1个字节大小的文件? –

回答

4

文件大小为2个字节(16位)。你不能有10位大小的文件(只有8,16,24,32,40 ...)。在磁盘中,为文件分配的大小可以与群集大小一样小。如果磁盘上的簇大小为4096字节,且文件大小小于簇大小,则文件系统将分配簇大小的内存。

大小以字节为单位,所以如果字节表示为字符串"00101"(5位),它将是00000101(8位)。

在你的情况侑字符串是"0101110011"(12位) - 它是两个字节:在串

  1. "01",这将是00000001在字节表示

  2. "01110011"在串,这将是01110011在字节 表示

Secon d字符串的长度为8,所以字节看起来像这个字符串。

您的字符串从'0'开始,但您可以省略'0'它们在开始时是无用的。这意味着比在字节表示值011100111110011是相同的。

赫普勒:

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位)。 您的数据将适合两个字节,因为@罗马已建议。

但这里谈到的问题

您的字符串是"0101110011"

和他的解决方案后,你将有两个字节跟随

0000000101110011

因此而让他们回来,从文件并将它们合并在一起,您将拥有16长度的字符串 "0000000101110011"

这不是你确切的字符串。

所以你将不得不引入一个开销,一个头将包含在最后一个字节中的输入字符串的长度。

{ 
    Byte length //here 2 
     Byte[] dataInBytes //here two byte 00000001 and 01110011 
} 
相关问题