[英]How To Write A String Of Binary To File C#
我有一串二進制數字像temp =“0101110011”我想保存為文件這個臨時有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位)。
在你的情況下,yor字符串是"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"
字符串
這不是你的確切字符串。
所以你必須引入一個開銷,一個包含最后一個字節輸入字符串長度的標題。
{
Byte length //here 2
Byte[] dataInBytes //here two byte 00000001 and 01110011
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.