簡體   English   中英

如何寫一個二進制字符串到文件C#

[英]How To Write A String Of Binary To File C#

我有一串二進制數字像temp =“0101110011”我想保存為文件這個臨時有10個字符我怎樣才能保存這個字符串到10位長度的文件?

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位

您的文件大小為2個字節(16位)。 你不能擁有10位大小的文件(只有8,16,24,32,40 ......)。 在磁盤中,為文件分配的大小可以與群集大小一樣小。 如果磁盤上的簇大小為4096字節且文件大小小於簇大小,則文件系統將分配簇大小的內存。

大小以字節為單位,因此如果字節表示中有字符串"00101" (5位),則為00000101 (8位)。

在你的情況下,yor字符串是"0101110011" (12位) - 它是兩個字節:

  1. 字符串中的"01"將以字節表示形式顯示為00000001

  2. 字符串中的"01110011"將以字節表示形式為01110011

第二個字符串的長度為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位)的大小,但文件系統為其分配更多內存(分配的內存大小將等於簇大小)。

你的字符串(代表10位)的二進制數是10,最小的數據類型是字節(8位)。 正如@Roma建議的那樣,你的數據將適合兩個字節。

但問題來了

你的字符串是"0101110011"

在他的解決方案之后,你將有兩個字節如下

0000000101110011

所以當從文件中取回它們並將它們合並在一起時,你將擁有16個長度為"0000000101110011"字符串

這不是你的確切字符串。

所以你必須引入一個開銷,一個包含最后一個字節輸入字符串長度的標題。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM