已回答 二进制文件读取

澳洲男孩

知名会员
已加入
2020年9月7日
留言内容
48
编程经验
Beginner
你好,
我需要从二进制文件中读取值。
标头由组成。
4个福彩12选5走势图,1个福彩12选5走势图,1个福彩12选5走势图,2个福彩12选5走势图,4个福彩12选5走势图,4个福彩12选5走势图,4个福彩12选5走势图
我有一个int32,byte,byte,inst16,int32,int32,int32。
应显示为484 5 30 1595434298 15 58。
(但是,目前还没有)
我刚开始使用Python,但由于其他原因需要切换到C#。

python代码看起来像

with open(filename, "rb") as file:
缓冲区= file.read(20)
大小,变化,objectType,pointIndex,startTime,sampleRate,count = struct.unpack('>IBBHiII', buffer)
打印(大小,变化,objectType,startTime,sampleRate,计数)

下面是C#的开始。

C#:
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;


namespace InsertHistoryCOMAPI
{
       class Program
       {
             static void Main(string[] args)
             {
                    // Specifing a file
                    string path = @"C:\DNP3File\XXXXXXXXXX";

                    // Calling the ReadAllBytes() function
                    byte[] readText = File.ReadAllBytes(path);

                    byte[] temp;

                    int[] values = new int[3];

                    temp = new byte[4];
                    Array.Copy(readText, 0, temp, 0, 4);
                    values[0] = BitConverter.ToInt32(temp, 0);
                    Console.WriteLine(values[0]);

                    temp = new byte[4];
                    Array.Copy(readText, 4, temp, 0, 1);
                    values[0] = BitConverter.ToInt32(temp, 0);
                    Console.WriteLine(temp);

                    temp = new byte[4];
                    Array.Copy(readText, 5, temp, 0, 1);
                    values[0] = BitConverter.ToInt32(temp, 0);
                    Console.WriteLine(temp);

                    temp = new byte[4];
                    Array.Copy(readText, 6, temp, 0, 2);
                    values[0] = BitConverter.ToInt16(temp, 0);
                    Console.WriteLine(values[0]);

                    temp = new byte[4];
                    Array.Copy(readText, 8, temp, 0, 4);
                    values[0] = BitConverter.ToInt32(temp, 0);
                    Console.WriteLine(values[0]);

                    temp = new byte[4];
                    Array.Copy(readText, 12, temp, 0, 4);
                    values[0] = BitConverter.ToInt32(temp, 0);
                    Console.WriteLine(values[0]);

                    temp = new byte[4];
                    Array.Copy(readText, 16, temp, 0, 4);
                    values[0] = BitConverter.ToInt32(temp, 0);
                    Console.WriteLine(values[0]);

                    Console.ReadLine();
             }
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,557
地点
悉尼,澳大利亚
编程经验
10+
不要从调用ReadAllBytes开始。只需根据需要从文件中读取福彩12选5走势图。尝试以下方法:
C#:
private short ReadShort(Stream stream)
{
    var bytes = new byte[2];

    stream.Read(bytes, 0, 2);

    return BitConverter.ToInt16(bytes, 0);
}

private int ReadInt(Stream stream)
{
    var bytes = new byte[4];

    stream.Read(bytes, 0, 4);

    return BitConverter.ToInt32(bytes, 0);
}
然后像这样使用它们:
C#:
using (var file = File.OpenRead(filePath))
{
    var b = (byte) file.ReadByte();
    var s = ReadShort(file);
    var i = ReadInt(file);
}
 

澳洲男孩

知名会员
已加入
2020年9月7日
留言内容
48
编程经验
Beginner
谢谢,

我改变了一点。至于下面。
我懂了
-469696512
5
30
-26310
979703903
251658240
973078528
我在寻找
484 5 30 1595434298 15 58
谢谢,

C#:
using (var file = File.OpenRead(path))

            {

                var size = ReadInt(file);
                Console.WriteLine(size);

                var variation = (byte)file.ReadByte();
                Console.WriteLine(variation);

                var objectType = (byte)file.ReadByte();
                Console.WriteLine(objectType);

                var pointIndex = ReadShort(file);
                Console.WriteLine(pointIndex);

                var startTime = ReadInt(file);
                Console.WriteLine(startTime);

                var sampleRate = ReadInt(file);
                Console.WriteLine(sampleRate);

                var numberOfSamples = ReadInt(file);
                Console.WriteLine(numberOfSamples);

                Console.ReadLine();
            }
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,971
地点
英国
编程经验
10+
那么,到底是什么?输出与预期不符。您能再说明一下吗?
 

澳洲男孩

知名会员
已加入
2020年9月7日
留言内容
48
编程经验
Beginner
嗨,我认为这会有所帮助。
它可能需要一个指针,以便它逐步执行并知道下一个福彩12选5走势图。
谢谢,

# Header = 20 words
#32位整数-大小
# 1 byte - Variation
# 1 byte - Object
# Object Variation
#30 1 32位整数样本
#30 2 16位整数样本
#30 3 32位整数样本
#30 4 16位整数样本
#30 5 32位浮点样本
#16位无符号整数-点索引,正在采样模拟点索引
#32位整数-启动时间EPOCH
#32位整数-采样率,模拟点采样之间的间隔(以秒为单位)
#32位整数-样本数,此文件中的样本记录数
#大小= 20 +(样本数)* 4-16位整数
#大小= 20 +(样本数)* 8-32位整数
 

澳洲男孩

知名会员
已加入
2020年9月7日
留言内容
48
编程经验
Beginner
00000000 00000000 00000001 11100100 00000101 00011110 00111010 10011001 01011111 00011000 01100101 00111010 00000000 00000000 00000000 00001111 00000000 00000000 00000000 00111010 00000000 00000000 00000000 00000000 01000000 10000000 10110011 01010000 00000000 00000001 00000000 00000000 01000000 01001010 11111111
 

澳洲男孩

知名会员
已加入
2020年9月7日
留言内容
48
编程经验
Beginner
我明天试试。我想这是正确的。
我有一个问题,目前看不到。
有什么机制可以确保读取正确的福彩12选5走势图并保持文件的当前位置?
谢谢,
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,557
地点
悉尼,澳大利亚
编程经验
10+
我有一个问题,目前看不到。
有什么机制可以确保读取正确的福彩12选5走势图并保持文件的当前位置?
A 文件流 有一个内部指针指示当前位置。您可以通过 位置 属性并通过设置 寻找 方法。这 方法从当前位置读取福彩12选5走势图,并将其前进读取的福彩12选5走势图数。例如,这:
C#:
stream.Read(bytes, 0, 4);
从当前流位置读取(最多)4个福彩12选5走势图,将位置提高读取的福彩12选5走势图数并将这些福彩12选5走势图存储在提供的数组中,从索引0开始。
 

澳洲男孩

知名会员
已加入
2020年9月7日
留言内容
48
编程经验
Beginner
嗨,我如何使以下工作。
我认为ToSingle到了浮点数。
谢谢,

C#:
int ReadFloat(Stream stream)
            {
                var bytes = new byte[4];

                stream.Read(bytes, 0, 4);

                Array.Reverse(bytes);

                return BitConverter.ToSingle(bytes, 0);

            }
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,595
地点
弗吉尼亚州切萨皮克
编程经验
10+
您遇到什么问题?

马上,我想您正在读一个浮点数,为什么要返回一个整数?
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,557
地点
悉尼,澳大利亚
编程经验
10+
I thought,
ToSingle()将指定的值转换为单精度浮点数吗?
而且您是对的,但是如果您的方法应该返回Single / float,那么方法声明是否应该指定该值?你的不是。看起来像一个案例"复制,粘贴并忘记编辑".
 
最佳 底部