如何写一个二进制字符串到文件C#

时间:2017-01-21 10:10:31

标签: c# bitarray binarywriter

我有一串二进制数字,如temp =" 0101110011"而且我想保存那个文件,这个温度有10个字符,如何将此字符串保存为10位长度的文件?

/test(?:(?!test|123).)*123/

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

2 个答案:

答案 0 :(得分:4)

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

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

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

  1. "01"字符串中的00000001字节表示

  2. 字符串中的
  3. "01110011",字节为01110011 表示

  4. 第二个字符串的长度为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位)的大小,但文件系统为其分配更多内存(分配的内存大小将等于群集大小)。

答案 1 :(得分:0)

长度你的字符串(代表10位)的二进制数是10,最小的数据类型是字节(8位)。 @Roma 建议您的数据符合两个字节。

但问题出现

你的字符串是"0101110011"

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

0000000101110011

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

这不是你的确切字符串。

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

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