我有一串二进制数字,如temp =" 0101110011"而且我想保存那个文件,这个温度有10个字符,如何将此字符串保存为10位长度的文件?
/test(?:(?!test|123).)*123/
使用此代码我的文件长度为80位
答案 0 :(得分:4)
您的文件大小为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位)的大小,但文件系统为其分配更多内存(分配的内存大小将等于群集大小)。
答案 1 :(得分:0)
长度你的字符串(代表10位)的二进制数是10,最小的数据类型是字节(8位)。 @Roma 建议您的数据符合两个字节。
但问题出现
你的字符串是"0101110011"
在他的解决方案之后你将有两个字节如下
00000001
和01110011
所以当从文件中取回它们并将它们合并在一起时,你将拥有16个字符串的长度
"0000000101110011"
这不是你的确切字符串。
所以你必须引入一个开销,一个包含最后一个字节输入字符串长度的标题。
{
Byte length //here 2
Byte[] dataInBytes //here two byte 00000001 and 01110011
}