如何有效地将String,integer,double,datetime转换为二进制,反之亦然?

时间:2011-02-19 14:57:25

标签: c# binary converter

我对C#很新(我使用的是.NET 4.0)所以请耐心等待。我需要将一些对象属性(它们的属性是int,double,String,boolean,datetime)保存到文件中。但我想使用自己的加密来加密文件,所以我不能使用FileStream转换为二进制文件。另外,由于性能问题,我不想使用对象序列化。这个想法很简单,首先我需要以某种方式将对象(它们的属性)转换为二进制(数组),然后加密(某种类型的xor)数组并将其附加到文件的末尾。当读取时首先解密数组,然后以某种方式将二进制数组转换回对象属性(我将从中生成对象)。

我知道(粗略=))如何手动转换这些东西,我可以编码,但它将是无用的(太慢)。我认为最好的方法就是将属性表示在内存中并保存。但我不知道如何使用C#(也许使用指针?)。我也想使用MemoryStream,但我觉得它效率低下。我正在考虑类Converter,但它不支持toByte(datetime)(文档说它总是抛出异常)。

为了转换回来,我认为唯一的选择是类转换器。

注意:我知道对象的结构,它们不会改变,最大字符串长度也是已知的。

感谢您的所有想法和时间。

编辑:我将只存储部分对象,在某些情况下还存储不同对象的部分(一个对象类型的一些属性和另一个对象的一对),因此我认为序列化对我来说不是一个选项。

3 个答案:

答案 0 :(得分:4)

您可以使用BinaryFormatter对它们进行序列化,然后在将它们写入FileStream之前加密它们。这将写入和读取一个对象(我使用DateTime作为示例)

using (FileStream sw = File.Create("D:\\Test.bin"))
{
     BinaryFormatter bf = new BinaryFormatter();
     bf.Serialize(sw, DateTime.Now);
}

using (FileStream sw = File.Open("D:\\Test.bin", FileMode.Open))
{
     BinaryFormatter bf = new BinaryFormatter();
     DateTime dt2 = (DateTime)bf.Deserialize(sw);
}

如果您只想要基本类型的“二进制”内容,可以使用:

Byte[] bytes = BitConverter.GetBytes(property)

对于DateTime,您可以保存Tick属性(如果需要Kind属性)。对于字符串,您使用Encoding.UTF8.GetBytes。

答案 1 :(得分:1)

有很多不同的方法可以做到这一点。也许最简单的,性能应该是足够的,将每个记录写入MemoryStream,得到结果字节数组,对该数组进行加密,然后使用{{1}将数组写入文件和FileStream

BinaryWriter

回读它很容易。您在文件上设置FileStream fs = new FileStream(...); BinaryWriter fileWriter = new BinaryWriter(fs); // Allocate byte array big enough to hold the longest record byte[] RecordBuffer = new byte[MaxRecordSize]; int recordLength; // to get the number of bytes in a record. // for each record using (var ms = new MemoryStream()) { using (var memWriter = new BinaryWriter(ms, Encoding.UTF8)) { // write things to the memory stream memWriter.Write(myStringValue); memWriter.Write(myLongValue); // ... etc. // Now get the number of bytes written memWriter.Flush(); recordLength = memWriter.Position; } } // The record is now serialized in RecordBuffer, from 0 to recordLength-1 // Do your encryption. // Then write a count of bytes, and the buffer: fileWriter.Write(recordLength); fileWriter.Write(RecordBuffer, 0, recordLength); ,调用BinaryReader以获取记录长度,调用ReadInt32以获取记录字节,进行解密,然后使用Read(RecordBuffer, 0, length)反序列化。

答案 2 :(得分:0)

我发布这个作为答案,因为我太绿了,不能写评论。

开始时序列化整个类,如Jens和Xanatos所说。很可能这很好。找出答案的最佳方法是尝试。

如果确实需要缩小文件,则创建仅包含需要序列化的成员的新类。当你去编写文件时,可以将较大的对象转换为较小的格式并序列化,然后在加载文件时,可以再次从较小的对象初始化完整的对象。