如何将二进制字符串写入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. 字符串中的"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"

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

CCD_ 20和CCD_ 21

因此,当从文件中取回它们并将它们合并在一起时,您将得到长度为16的字符串"0000000101110011"

这不是你的确切字符串。

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

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

最新更新