问题标签 [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 投票
2 回答
1535 浏览

.net - 在 .NET 中反序列化以空字符结尾的字符串的最佳方法是什么?

我正在从我的网络连接中读取一条消息,该消息被序列化为一系列以空字符结尾的字符串(和其他二进制数据)

我可以使用 BinaryReader 一次读取一个字符,直到找到 NULL。

有没有更有效的方法仍然简单?我期望字符串长度小于 64 个字符,但它们可能会更长。

0 投票
5 回答
2657 浏览

c# - c# - 从每 6 秒更新一次的二进制日志文件中读取 12k 的数据

我有一个二进制日志文件,其中包含来自传感器(Int16)的流数据。
每 6 秒添加 6000 个 Int16 类型的样本,直到传感器断开连接。

我需要定期轮询这个文件,从最后读取的位置继续。a)保持文件流和二进制读取器打开并在读取之间实例化是否更好 b)每次我需要读取时实例化文件流和二进制读取器(并保留一个外部变量来跟踪最后读取的位置)c)更好的东西?

编辑:到目前为止,一些很棒的建议需要补充一点,“服务器”应用程序是由外部源供应商提供的,无法修改。

0 投票
1 回答
285 浏览

c# - 上传到Oracle DB前后文件不一致

我试图让我的网站允许用户上传各种文件(HttpPostedFile),然后将这些文件作为 BLOB 存储在 Oracle 数据库中。这是我到目前为止所得到的:

文件成功上传和下载 - 但是,下载的文件与上传的文件不同。我已经验证了内容与它进出数据库的文件相同,这意味着该文件要么没有被正确转换,要么没有被客户端正确保存。这两个文件在磁盘上的大小相同,但根据 Windows 不同。根据十六进制编辑器,下载的文件副本似乎在文件的开头缺少 3 个字节。

这是我用来将文件传输到客户端的内容: Response.Clear(); Response.AddHeader("Content-Disposition", "attachment; filename=" + fileinfo[1]);
Response.AddHeader("内容长度", filedata.Length.ToString());
Response.ContentType = "应用程序/八位字节流"; Response.BinaryWrite(文件数据);

任何帮助,将不胜感激。

0 投票
4 回答
12466 浏览

c# - .NET 中更快(不安全)的 BinaryReader

我遇到了一种情况,我有一个非常大的文件,我需要从中读取二进制数据。

因此,我意识到 .NET 中的默认 BinaryReader 实现非常慢。在使用.NET Reflector查看它时,我遇到了这个问题:

想想自 32 位 CPU 发明以来计算机是如何设计为使用 32 位值的,这让我觉得效率极低。

所以我用这样的代码创建了自己的(不安全的)FastBinaryReader 类:

这要快得多 - 我设法将读取 500 MB 文件的时间缩短了 5-7 秒,但总体上仍然很慢(最初是 29 秒,现在使用我的 22 秒FastBinaryReader)。

我仍然有点困惑,为什么读取这么小的文件仍然需要这么长时间。如果我将文件从一个磁盘复制到另一个磁盘只需几秒钟,因此磁盘吞吐量不是问题。

我进一步内联了 ReadInt32 等调用,最后得到了以下代码:


关于如何使这更快的任何进一步的想法?我在想也许我可以使用编组将整个文件直接映射到一些自定义结构之上的内存中,因为数据是线性的、固定大小的和连续的。

已解决:我得出的结论是 FileStream 的缓冲/BufferedStream 存在缺陷。请在下面查看接受的答案和我自己的答案(带有解决方案)。

0 投票
3 回答
7936 浏览

c# - 从字节 [] 转换为字符串

我有以下代码:

FILE_PATH 是一个 const 字符串,其中包含正在读取的二进制文件的路径。二进制文件是整数和字符的混合体。每个整数为 1 个字节,每个字符以 2 个字节写入文件。

例如,该文件具有以下数据:

1你好,你好吗45你看起来很棒//等等

请注意:每个整数都与它后面的字符串相关联。所以 1 与“HELLO HOW ARE YOU”相关联,45 与“YOU ARE LOOKING GREAT”相关联,以此类推。

现在写入二进制文件(我不知道为什么,但我必须忍受这个),这样“1”将只占用 1 个字节,而“H”(和其他字符)每个占用 2 个字节。

所以这是文件实际包含的内容:

0100480045..等等以下是细分:

01 是整数 1 的第一个字节 0048 是 'H' 的 2 个字节(H 是 48 十六进制) 0045 是 'E' 的 2 个字节(E = 0x45)

等等..我希望我的控制台从这个文件中打印出人类可读的格式:我希望它打印“1 HELLO HOW ARE YOU”然后“45 YOU ARE LOOKING GREAT”等等......

我在做什么正确吗?有没有更简单/有效的方法?我的线 Console.WriteLine(Convert.ToString(b[pos])); 除了打印整数值而不是我想要的实际字符之外什么都不做。文件中的整数可以,但是如何读出字符?

任何帮助将非常感激。谢谢

0 投票
3 回答
4226 浏览

.net - VB.NET 二进制文件中的 0x00

更新如下

我正在使用 VB.NET 中的 BinaryReader 读取二进制文件。文件中每一行的结构是:

问题是“文本”字段有一些用于填充的时髦字符。大多数似乎是 0x00 空字符。

  1. 有没有办法通过一些编码来摆脱这些 0x00 字符?

  2. 否则,如何在 chText 数组上进行替换以摆脱 0x00 字符?我正在尝试将生成的数据表序列化为 XML,但在这些不兼容的字符上失败了。我能够遍历数组,但是我不知道如何进行替换?

更新:

这就是我在下面的男人/女孩的很多帮助下所处的位置。第一个解决方案有效,但不像我希望的那样灵活,第二个解决方案在一个用例中失败,但更通用。

广告 1)我可以通过将字符串传递给这个子例程来解决这个问题

广告 2) 此例程确实删除了几个违规字符,但由于 0x00 失败。这改编自 MSDN, http: //msdn.microsoft.com/en-us/library/kdcak6ye.aspx

0 投票
4 回答
9869 浏览

c# - C++ 中是否有 BinaryReader 来读取从 C# 中的 BinaryWriter 写入的数据?

我已经用 C# 中的 BinaryWriter 将几个整数、char[] 等写入数据文件。使用 BinaryReader(在 C# 中)读回文件,我可以完美地重新创建文件的所有部分。

然而,尝试用 C++ 将它们读回会产生一些可怕的结果。我正在使用 fstream 尝试读回数据,但数据未正确读入。在 C++ 中,我设置了一个 fstreamios::in|ios::binary|ios::ate并使用 seekg 来定位我的位置。然后我读取了接下来的四个字节,它们被写为整数“16”(并正确读取到 C# 中)。这在 C++ 中读取为 1244780 (不是内存地址,我检查了)。为什么会这样?C++ 中是否有与 BinaryReader 等价的东西?我注意到它在 msdn 上提到过,但那是 Visual C++,而智能感知在我看来甚至不像 C++。

编写文件的示例代码(C#):

我不确定如何向您展示数据文件。

读回数据的示例(C#):

这是我想在 C++ 中执行的。初始尝试(在第一个整数处失败):

编辑:似乎无论我在哪个位置使用“seekg”,我都会收到完全相同的值。

0 投票
2 回答
11827 浏览

c# - C# BinaryReader“流不支持查找操作”

我正在尝试使用 C# 和 ftpwebrequest 从 ftp 服务器下载文件。我可以使用 BinaryReader 获取字节,但是当我尝试使用 br.ReadBytes(int) 读取流时,我收到 BinaryReader 不支持查找操作的错误。

有谁知道如何最好地读取字节以便我可以将它们写入文件?

这是完整的方法:

这作为正在进行的服务的一部分运行,所以我不想抛出会停止服务的错误。相反,我正在写日志。以下是此方法的日志内容:

我已经在这种方式上工作了太久,所以任何帮助将不胜感激!

谢谢!!

0 投票
1 回答
67 浏览

c# - 尝试读取数据时出现奇怪的问题

当我写:

...它的工作,但当我写:

...它不起作用,我不明白为什么 - 我得到了意想不到的结果。方法ReadNext3Bytes如下:

为什么会这样,我该如何解决?

谢谢。

0 投票
4 回答
4007 浏览

c# - BinaryReader.ReadChars() 的问题

我遇到了我认为 BinaryReader.ReadChars() 方法的问题。当我在原始套接字 NetworkStream 周围包装 BinaryReader 时,偶尔会出现流损坏,其中正在读取的流不同步。有问题的流包含二进制序列化协议中的消息。

我已经追踪到以下内容

  • 它仅在读取 unicode 字符串时发生(使用 Encoding.BigEndian 编码)
  • 仅当有问题的字符串拆分为两个 tcp 数据包时才会发生(使用 wireshark 确认)

我认为正在发生的事情如下(在下面的例子中)

  • 调用 BinaryReader.ReadChars() 要求它读取 3 个字符(字符串长度在字符串本身之前编码)
  • 第一个循环在内部请求从网络流中读取 6 个字节(剩余 3 个字符 * 2 个字节/字符)
  • 网络流只有 3 个字节可用
  • 3 个字节读入本地缓冲区
  • 缓冲区交给解码器
  • 解码器解码 1 个字符,并将另一个字节保存在它自己的内部缓冲区中
  • 第二个循环内部请求读取 4 个字节!(2 个剩余字符 * 2 个字节/字符)
  • 网络流有全部 4 个字节可用
  • 4字节读入本地缓冲区
  • 缓冲区交给解码器
  • 解码器解码 2 个字符,并在内部保留剩余的第 4 个字节
  • 字符串解码完成
  • 由于流损坏,序列化代码尝试解组下一个项目并发出呱呱叫声。

    /li>

我认为根是 .NET 代码中的一个错误,它使用 charsRemaining * bytes/char 每个循环来计算所需的剩余字节。由于解码器中隐藏了额外的字节,这个计算可能会被关闭,导致额外的字节从输入流中消耗掉。

这是有问题的 .NET 框架代码

我不完全确定这是一个错误还是只是滥用 API。为了解决这个问题,我只是自己计算所需的字节,读取它们,然后通过相关的 Encoding.GetString() 运行 byte[]。但是,这不适用于 UTF-8 之类的东西。

有兴趣听听人们对此的想法以及我是否做错了什么。也许它会为下一个人节省几个小时/几天的繁琐调试。

编辑:张贴连接连接跟踪项目