编程语言
首页 > 编程语言> > 如何将二进制字符串写入文件C#

如何将二进制字符串写入文件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位)-它是两个字节:

>字符串中的“ 01”,字节表示形式为00000001
>字符串中的“ 01110011”,该字节为01110011
表示

第二个字符串的长度为8,因此字节看起来像这个字符串.

您的字符串从“ 0”开始,但是您可以省略“ 0”,它们在开始时没有用.这意味着字节表示中的值01110011和1110011相同.

赫普勒:

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个字节,然后将其转换为字符串.但是这些字节中的字符串将是“ 0000000101110011”(开头没有多余的“ 0”).

要获取以“ 1”开头的字符串:

string withoutZeroes = 
       withZeroes.Substring(withZeroes.IndexOf('1'), str.Length - withZeroes.IndexOf('1'));

在所有操作(带有字符串“ 0101110011”)之后,您的文件将具有2个字节(16位)的大小,但是文件系统为其分配了更多的内存(分配的内存的大小将等于群集的大小).

标签:bitarray,binarywriter,c
来源: https://codeday.me/bug/20191026/1935634.html