如何将二进制字符串写入文件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