如何将一串二进制文件写入C#文件

How To Write A String Of Binary To File C#

我有一个二进制数字符串,如 temp = "0101110011",我想将其保存为文件,这个 Temp 有 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 位)。

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

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

  2. 字符串中的
  3. "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"

这不是您的确切字符串。

所以你必须引入一个开销,一个 header 它将在最后一个字节中包含输入字符串的长度。

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