如何将一串二进制文件写入C#文件
How To Write A String Of Binary To File 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 个字节,然后将其转换为 string
。但是来自这些字节的字符串将是 "0000000101110011"
(开头有不必要的 '0'
)。
获取从'1'
开始的字符串:
string withoutZeroes =
withZeroes.Substring(withZeroes.IndexOf('1'), str.Length - withZeroes.IndexOf('1'));
完成所有操作(使用字符串 "0101110011"
)后,您的文件大小为 2 字节(16 位),但文件系统为其分配了更多内存(分配的内存大小将等于簇大小)。
你的二进制数字符串(代表10位)的长度是10,最小数据类型是字节(8位)。
正如 @Roma 所建议的那样,您的数据将适合两个字节。
但是问题来了
你的字符串是 "0101110011"
在他的解决方案之后你将有两个字节如下
00000001
和 01110011
因此,从文件中取回它们并将它们合并在一起时,您将得到长度为 16 的字符串
"0000000101110011"
这不是您的确切字符串。
所以你必须引入一个开销,一个 header 它将在最后一个字节中包含输入字符串的长度。
{
Byte length //here 2
Byte[] dataInBytes //here two byte 00000001 and 01110011
}
我有一个二进制数字符串,如 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 个字节,然后将其转换为 string
。但是来自这些字节的字符串将是 "0000000101110011"
(开头有不必要的 '0'
)。
获取从'1'
开始的字符串:
string withoutZeroes =
withZeroes.Substring(withZeroes.IndexOf('1'), str.Length - withZeroes.IndexOf('1'));
完成所有操作(使用字符串 "0101110011"
)后,您的文件大小为 2 字节(16 位),但文件系统为其分配了更多内存(分配的内存大小将等于簇大小)。
你的二进制数字符串(代表10位)的长度是10,最小数据类型是字节(8位)。 正如 @Roma 所建议的那样,您的数据将适合两个字节。
但是问题来了
你的字符串是 "0101110011"
在他的解决方案之后你将有两个字节如下
00000001
和 01110011
因此,从文件中取回它们并将它们合并在一起时,您将得到长度为 16 的字符串
"0000000101110011"
这不是您的确切字符串。
所以你必须引入一个开销,一个 header 它将在最后一个字节中包含输入字符串的长度。
{
Byte length //here 2
Byte[] dataInBytes //here two byte 00000001 and 01110011
}