【问题标题】:How To Write A String Of Binary To File C#如何将二进制字符串写入文件 C#
【发布时间】:2017-06-06 07:03:21
【问题描述】:

我有一个二进制数字符串,例如 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 位

【问题讨论】:

  • 你想要文件0101110011 大小为 10 位吗?
  • @Roma 不,我想将其另存为 .data
  • 您是否期望将“10101010”保存到文件中最终会产生 1 字节大小的文件??
  • @ΦXocę웃Пepeúpaツ 是
  • 你在问什么 - 你存储了长度为 10 的字符串的文件,它的大小为 10 位。这是不可能的。最小大小为 2 字节(16 位),不会丢失数据

标签: c# bitarray binarywriter


【解决方案1】:

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

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

在您的情况下,您的字符串是 "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 位)大小,但文件系统会为其分配更多内存(分配的内存大小将等同于集群大小)。

【讨论】:

    【解决方案2】:

    二进制数的字符串(代表 10 位)长度为 10,最小数据类型为字节(8 位)。 正如 @Roma 所建议的那样,您的数据将适合两个字节。

    但问题来了

    你的字符串是"0101110011"

    在他的解决方案之后,你将有如下两个字节

    0000000101110011

    所以在从文件中取回它们并将它们合并在一起时,您将拥有 16 长度的字符串 "0000000101110011"

    这不是你的确切字符串。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 2020-08-28
      • 2016-05-08
      • 2021-10-27
      • 2016-01-15
      • 2012-06-08
      • 1970-01-01
      相关资源
      最近更新 更多