将4字节浮点纯二进制小端格式转换为C#中的纯文本?

时间:2014-06-11 04:13:18

标签: c# binary endianness

我是C#中二进制文件处理的新手。

我有一个4 Byte float plain二进制小端格式(.dat)数据文件。我想在文本文件中写入数据。在C#中有可能吗?

我尝试过从不同来源找到的代码。但我失败了。

任何人有任何建议或参考或示例代码?我希望在C#中这样做,因为我熟悉它。

当我在记事本中打开文件时 值看起来像:

S™¿S™¿S™¿S™¿S™¿S™¿S™¿S™¿S™¿S™¿S™¿S™¿S™¿S™¿S™¿S™ ¿S™¿S™¿S™¿S™¿S™¿S™¿S™¿S™¿S™¿S™¿S™¿S™¿S™¿S™¿S™¿S™¿š ™¿™™™¿™™™š™š™š™¿š™¿š™¿š™¿,Á,Á,Á,Á,ÁìQ,ÁìQ,ÁìQ, AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ, AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ, AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ, AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ,AIQ, ÁìQ,ÁìQ,ÁìQ,Á,Á,Á,Á,Á,Á, Á,Á,Á,Á

我尝试过的代码。

        string inputFilename="F:\\nkg.0000.dat";
        string outputFilename = "F:\\test.txt";
        byte[] fileBytes = File.ReadAllBytes(inputFilename);

        int counter = fileBytes.Length;
        MessageBox.Show(counter.ToString());
        for (int k = 0; k < counter; k++)
        {
            File.AppendAllText(outputFilename, (fileBytes[k].ToString() + "\r\n"));
        }

它给出这样的值: 205 204 76 192 205 204 76 192 205 204 76 192 205 204 76 192 205 204 76 192 205 204 76 192 205 204 76 192 205 204 76

输出包含1000个值,但应包含250个值。 似乎值似乎不正确。但我不知道实际值。

2 个答案:

答案 0 :(得分:0)

试试这个:

string inputFilename="F:\\nkg.0000.dat";
string outputFilename = "F:\\test.txt";
byte[] fileBytes = File.ReadAllBytes(inputFilename);
int count = fileBytes.Length / 4;
StringBuilder s = new StringBuilder();
for (int k = 0; k < count; k += 4) {
    float f = BitConverter.ToSingle(fileBytes, k);
    s.AppendLine(f.ToString());
}
File.AppendAllText(outputFilename, s.ToString());

由于您需要原始浮点值,因此必须将字节转换为浮点数。基本部分是BitConverter.ToSingle(fileBytes, k),它将4个字节转换为32位浮点值。

请注意,浮点数仅为字节数的1/4,k增加4(32位浮点数= 4字节)。因此,上面的代码返回了预期的250个浮点数。

还有一个提示:
不要在for循环中使用File.AppendAllText - 这会打开,写入和关闭文件250次。将所有浮点数转换为字符串并将其附加到StringBuilder并在单个调用中将其写入文件。这速度更快,使用的资源更少。

答案 1 :(得分:0)

由于您正在使用File.ReadAllBytes来读取数据,因此您将获得一个字节数组,而不是您所说的数据文件所包含的浮点数组。这也解释了为什么你得到1000个值而不是你期望的250个值(因为浮点数是4个字节)。

看看BitConverter.ToSingle(http://msdn.microsoft.com/en-us/library/system.bitconverter.tosingle(v=vs.110).aspx)将你得到的字节值转换成浮点数。