问题标签 [binaryreader]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
170 浏览

c# - MFCArchiveFileReader 和 C# BinaryReader 之间的区别

我有一些用 MFC 编写的代码,可将数据写入文件。现在我正在用 C# 重写该代码。在 MFC 代码中,数据正在使用 CArchive 写入文件中。现在我正在考虑在 C# 中使用 BinaryReader 从文件中读取数据。

所以我的问题是它们是相同的 CArchive 和 BinaryReader 吗?如果不是,那么有什么区别以及我应该使用什么。

我不擅长 MFC,我假设 CArchive 将二进制数据写入文件。这个假设正确吗?

0 投票
2 回答
1873 浏览

c# - 使用 BinaryReader c# 从开头读取文件到特定位置

我已将数据保存BinaryWriter在文件中。

现在我想使用从该文件(从特定位置开始)读取数据BinaryReader

在写入文件时,我在文件中间添加了一个字符串“BREAK”。

我想在 C# 中从0 到“BREAK”之前和“BREAK”之后读取文件的结尾。请帮我。

0 投票
1 回答
750 浏览

c# - 用于从文件中读取非常大的字节数组的不同数据类型和大小的循环

我有一个存储在文件 (rawbytes.txt) 中的原始字节流,我需要对其进行解析并输出到 CSV 样式的文本文件。

原始字节的输入(当读取为字符/长/整数等时)看起来像这样:

解析后应如下所示:

输出A.txt

输出B.txt

输出C.txt

本质上,它是一个 hex-dump 样式的字节输入,它是连续的,没有任何行终止符或需要解析的数据之间的间隙。如上所示,数据由一个接一个的不同数据类型组成。

这是我的代码片段 - 因为任何字段中都没有逗号,并且不需要使用“”(即 CSV 包装器),我只是使用 TextWriter 来创建 CSV 样式的文本文件,如下所示:

我的问题很简单——如何使用循环来读取整个文件?通常,它超过 1 GB(排除 File.ReadAllBytes 和Best way to read a large file into a byte array in C#?建议的方法) - 我考虑使用 while 循环,但 peekchar 不适合这里。此外,案例 A、B 等具有不同大小的输入 - 换句话说,A 总共可能是 40 个字节,而 B 是 50 个字节。因此,使用固定大小的缓冲区,例如 inputBuf [1000] 或 [50] - 如果它们的大小都相同 - AFAIK 也不能很好地工作。

有什么建议么?我对 C# 比较陌生(2 个月),所以请保持温和。

0 投票
1 回答
1082 浏览

c# - 更改 BinaryReader 的 BaseStream 的位置如何影响使用相同 BaseStream 的 BinaryWriter 的当前状态?

我正在研究一个监视流的解析器(可能来自 a NetworkStream)。当在源流上看到某些数据时,将MemoryStream创建一个新数据并将来自源的相关数据写入其中。

然后我将MemoryStreamfor 解析传递给另一个将 解析MemoryStreamStream. 在这个方法BinaryReader中创建了一个。当它去读取数据时没有,因为BinaryReader它实际上是在数据的末尾。

BinaryReader 没有Position属性或方法,因此需要更改Seek下划线位置。BaseStream一旦位置改变,就可以解析流。

在这种情况下,我们不会添加额外的数据,所以没有问题。但是我想到,如果出现类似的情况并且要向其中写入额外的数据,这可能不起作用,因为位置值在其背后发生了变化。

我对这里的含义有点模糊。

BaseStream作者和读者是否使用及其位置的副本或允许损坏的原始对象?

这是否意味着我需要在创建编写器的同时创建读取器,以便两者都从同一个位置开始,然后将读取器传递给方法而不是BaseStream? 我认为这可能是一个更好的做法。

BinaryReader 和 Writer 是否维护自己的位置信息?我不是因为财产不在那里。如果不能,您可以在同一个线程中同时使用它们吗?

更新#1:基于已被撤回的答案和评论,我认为我需要让我的困惑更清楚一点。和中都有一个BaseStream属性。我认为它指向用于创建写入器和读取器的流对象。我开始认为这只是两者独有的工作对象。BinaryWriterBinaryReader

我不想对流对象做太多假设,以便我对多种类型的流作为源保持开放。

更新#2:现在运行一些测试代码后,我看到它们已连接。写入数据时,它会影响读取器的位置。我会认为阅读器不会受到影响,这样它就可以从中断的地方继续阅读流的下一部分,这很有用。我设想过这样的事情:

  • 发生数据事件。该事件导致写入器写入数据。
  • 在某些时候,阅读器会处理流中的一些数据。
  • 发生另一个事件,导致要写入更多数据。
  • 它被附加到读者已经在处理的数据中。
  • 读者完成包括新数据在内的工作。

但是基于位置在读者和作者之间的工作方式,这不是使用流的方式。

也许我的概念问题是因为我的 BaseStream 是 MemoryStream 并且规则与 NetworkStream 不同。我试图将流源的实现细节保留在阅读类之外。

我想此时我已经有了问题的答案。现在我需要找到有关使用流来做我脑海中的那种事情的信息。

0 投票
1 回答
2096 浏览

c# - C# BinaryReader 速度明显较慢。选择?

对于我的项目,我需要从文件中编写 UInt16、UInt32、字节和字符串。我从一个这样写的简单类开始:

我认为使用已经存在的 BinaryReader 可能会更好,所以我尝试了它,但我注意到它比我的方法慢。有人可以解释为什么会这样吗?如果有另一个已经存在的类我可以用来加载文件并从中读取?

~阿杜拉

0 投票
1 回答
1116 浏览

c# - 尽管解析字节数据时出错,如何继续循环

我的问题是这个的延续:(用于从文件中读取非常大的字节数组的不同数据类型和大小的循环

我有一个存储在文件(rawbytes.txt 或 bytes.data)中的原始字节流,我需要对其进行解析并输出到 CSV 样式的文本文件。

原始字节的输入(当读取为字符/长/整数等时)看起来像这样:

解析后应如下所示:

输出A.txt

输出B.txt

输出C.txt

本质上,它是一个 hex-dump 样式的字节输入,它是连续的,没有任何行终止符或需要解析的数据之间的间隙。如上所示,数据由一个接一个的不同数据类型组成。

这是我的代码片段 - 因为在任何字段中都没有逗号,并且不需要使用“”(即 CSV 包装器),我只是使用 TextWriter 来创建 CSV 样式的文本文件,如下所示:

我的问题是基于这样一个事实,即一些原始字节数据包含空值,这些值很难解析——因为在连续数据之间存在未知数量的空字节(或非空、异位字节)块(如果数据块没有损坏,则每个块都以 A、B 或 C 开头)。

问题

那么,尽管由于数据损坏或错误数据可能会出现错误,我如何添加默认情况或其他一些机制来继续循环?以下代码是否可行?

剩下的部分 - 向每个 switch case(例如'A')添加代码以继续而不停止程序 - 有没有办法在没有多个 try-catch 块的情况下做到这一点?[即代码块字符标识符是A,但是A之后的字节已损坏-在这种情况下,我需要退出循环或读取(即跳过)定义的字节数-在这里,如果消息头就知道了正确识别剩余字节。

[注意:案例 A、B 等具有不同大小的输入 - 换句话说,A 总共可能是 40 个字节,而 B 是 50 个字节。因此,使用固定大小的缓冲区,例如 inputBuf [1000] 或 [50] - 如果它们的大小都相同 - AFAIK 也不能很好地工作。]

有什么建议么?请帮忙!我对 C# 比较陌生(2 个月)...

更新:我的整个代码如下:

我收到的错误如下:

更新:生成上述相同错误的示例文件位于以下链接: http: //www.wikisend.com/download/106394/rawbytes.txt

请特别注意连续数据块之间的 8 个意外空字节,即使数据块标头(即inputCharIdentifier)是有效的。此类标头后面的字节数始终是不可预测的,并且通常会有所不同。我的问题是,当出现下一个可用的非损坏数据块时,我需要能够删除或跳过这种情况 - 对于示例文件,最后一个(单个)数据块发生在8 个异位空字节。

8 个空字节可以按如下方式在文件中定位:字节计数器:1056 第 2 行,第 783 列(根据 Notepad++)

问题的症结在于 8 个空字节可以是任意大小 - 3、7、15、50 等。它始终是未知的 - 作为数据损坏的直接结果。但与“传统”数据损坏不同,即固定数量的字节,比如 50,在可能不可读的数据块内,因此可以跳过(按确切的字节数) - 我面临的数据损坏包括有效数据块之间的未知字节数。

0 投票
3 回答
1809 浏览

asp.net - BinaryReader.ReadBytes 转换为字符串时返回垃圾

如果我试图解释为什么我需要做我想做的事情,那将需要很长时间,但基本上是这样的:我有 FileUpload 控件供用户选择 Jpeg 文件,我进行上传,然后我想要将该文件转换为字节并将其用作 Image 控件的源。

我的代码是这个:

字节数组看起来不错,但是当我将它转换为字符串时,它充满了无法识别的字符,我有另一个页面,我在其中做同样的事情,但我没有从文件中获取字节,而是从 MySql 数据库中获取它并使用相同的System.Text.Encoding.UTF8.GetString它可以毫无问题地工作。

更新 如要求,这是我从 MySql 数据库中检索时使用的代码:

这个 SqlDataSource3 的选择很简单Select BIN_FOTO from temp_image。我从网络摄像头捕获 WPF 程序将此值存储在数据库中,用于转换网络摄像头捕获的图像的代码是:

然后我将base64变量保存到数据库中。

希望这能澄清我的问题

0 投票
1 回答
764 浏览

c# - C#在不知道文件格式的情况下读取二进制文本文件

好的,所以我有一个使用 BinaryWriter 编写的二进制文本文件。由于文档不足,文件的格式已丢失。

我使用 BinaryReader 读取文件,但我能做到这一点的唯一方法是通过试错,逐步浏览文件并猜测我是否应该使用 BinaryReader 类的 ReadInt64()、ReadString() 等。

是否有单步执行文件并自动确定下一个值格式是什么?

0 投票
2 回答
163 浏览

c# - NetworkStream 一个我在我的代码中不理解的东西

我在上一个关于如何发送图像的问题中获得了帮助。所做的事情是首先发送图像的长度(大小),然后发送实际图像,然后它会知道何时完成。

它看起来像这样:

这段代码来自:Angelo Geels,他在我之前的问题中帮助了我。

现在,我试图以某种方式优化它。而且,它有效。但仅当文件是 bmp(未压缩)时,我不知道为什么。

因此 PrintWindow 将图像保存到内存流并返回。所以 ms = memorystream 里面有我的图像。

所以对我来说,这应该可以完美地工作,因为我可以做同样的事情。

我发送文件的大小(内存流的长度)。然后我在内存流中发送 byte[] 数据。

所以,是一样的。

但是,它只适用于 bmp。

我唯一能想到的是,当我以压缩格式保存时,首先写入 bmp 然后编码,这会弄乱 getbuffer() 或其他东西。

但我仍然认为它应该工作。

0 投票
1 回答
1491 浏览

c# - C# BinaryReader 从未知结构中读取字节

我正在尝试读取包含目录和文件条目的存档文件。我已经设法读出文件的标题并获取信息。

您可以在此处找到有关格式的信息

现在该文件包含一个目录模块,从文件源开始 2048 个字节后开始。

我所知道的是 TOC 可以包含两件事:

遵循以下结构的目录条目:

  • 4bytes :int32 : 存储条目名称的名称偏移量
  • 4bytes : int32 : Information flags , 4 个字节的每一位都包含关于某事的信息
  • 4bytes : Uint32 : 内容入口索引
  • 4bytes : uint32 : 内容条目计数

文件条目遵循以下结构:

  • 4bytes : int32 : 名称偏移量
  • 4字节:int32:文件大小
  • 3bytes : Uint24 : 文件存储位置的偏移量
  • 1byte : Uchar8 : 资源类型
  • 4byte : uint32 : 信息标志

现在这对于每个目录条目或文件条目都是一样的。

问题是我不知道目录中的第一个或每个条目的顺序是什么,这是未知的。

我所知道的是文件头,是条目数,有多少条目和目录大小。

无论如何用二进制阅读器找出我需要阅读每个条目的形式或找出它是什么特定类型的条目?

我将为此使用 for 循环,因为我知道标题中的条目数。

感谢任何帮助