2017-01-21 99 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 
} 
相關問題