问题标签 [binary-data]

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 投票
1 回答
3036 浏览

vbscript - 使用 vbscript 将 32 位浮点数转换为二进制字节或字表示

我不知道如何在 vbscript(不是 vb)中做两个相关的任务——我需要将一个 32 位浮点数分解为它的 4 字节二进制表示。- 我需要将 32 位浮点数分解为 2 字(aka16 位)二进制表示。

例如,二进制格式的 65535.0 是 100011101111111111111100000000 十六进制格式的 65535.0 是 477Fff00 65535.0 格式的字节是 71, 127, 255, 0 65535.0 格式的字是 18303, -256 [最后两个是什么]

参考:http ://babbage.cs.qc.edu/IEEE-754/32bit.html

0 投票
2 回答
1821 浏览

java - 有哪些好的二进制数据压缩 Java 库?

我正在研究压缩二进制数据,更具体地说是序列化的 Java 对象。我想我需要实现此 Wikipedia 页面上列出的算法之一。我找到了一些教程和博客文章,但没有库(而且我发现的大多数代码似乎都是从其他语言移植过来的......而且我不相信方法名称以大写字母开头的 Java 库的效率和准确性) . 因此,任何关于哪种算法最适合压缩序列化 Java 对象(以及任意二进制数据)的指针都将不胜感激。如果有人知道与该主题相关的活动项目,那将是惊人的(Apache 似乎没有任何东西)。

0 投票
1 回答
1294 浏览

.net - 使用 .NET 将二进制数据(例如二进制文件)导出为字符串?

如何在.NET中将二进制数据(例如 excel 或 word 文档等二进制文件)转换/导出为字符串(转换为文本格式),以便可以将其导入其他地方(例如,在另一个应用程序中,这是编写的用另一种编程语言(不在 .NET 中))。是否有实现这一目标的通用概念?

0 投票
3 回答
32660 浏览

java - 使用 apache commons-net FTPClient 传输原始二进制文件?

更新:已解决

FTPClient.setFileType() 我在登录之前打电话,导致 FTP 服务器使用默认模式 ( ASCII),无论我将其设置为什么。另一方面,客户端表现得好像文件类型已正确设置。BINARY模式现在完全按预期工作,在所有情况下都按字节传输文件。我所要做的就是在wireshark 中嗅探一下流量,然后使用netcat 模拟FTP 命令以查看发生了什么。为什么我前两天没有想到!?谢谢大家的帮助!

我有一个 utf-16 编码的 xml 文件,我使用 apache 的 commons-net-2.0 java 库的 FTPClient 从 FTP 站点下载该文件。它提供对两种传输模式的支持:ASCII_FILE_TYPEBINARY_FILE_TYPE,不同之处在于ASCII它将用适当的本地行分隔符替换行分隔符('\r\n'或者只是'\n'-- 十六进制,0x0d0a或者只是0x0a)。我的问题是:我有一个 utf-16 编码的测试文件,其中包含以下内容:

<?xml version='1.0' encoding='utf-16'?>
<data>
    <blah>blah</blah>
</data>

这是十六进制:
0000000: 003c 003f 0078 006d 006c 0020 0076 0065 .<.?.x.m.l. .v.e
0000010: 0072 0073 0069 006f 006e 003d 0027 0031 .r.s.i.o.n.=.'.1
0000020: 002e 0030 0027 0020 0065 006e 0063 006f ...0.'. .e.n.c.o
0000030: 0064 0069 006e 0067 003d 0027 0075 0074 .d.i.n.g.=.'.u.t
0000040: 0066 002d 0031 0036 0027 003f 003e 000a .f.-.1.6.'.?.>..
0000050: 003c 0064 0061 0074 0061 003e 000a 0009 .<.d.a.t.a.>....
0000060: 003c 0062 006c 0061 0068 003e 0062 006c .<.b.l.a.h.>.b.l
0000070: 0061 0068 003c 002f 0062 006c 0061 0068 .a.h.<./.b.l.a.h
0000080: 003e 000a 003c 002f 0064 0061 0074 0061 .>...<./.d.a.t.a
0000090: 003e 000a                                                            .>..

当我ASCII对此文件使用模式时,它会正确地逐字节传输;结果具有相同的 md5sum。伟大的。当我使用传输模式时,除了将字节从 an 洗牌到 anBINARY之外什么都不做,结果是换行符 ( ) 被转换为回车符 + 换行符对 ( )。这是二进制传输后的十六进制:InputStreamOutputStream0x0a0x0d0a

0000000: 003c 003f 0078 006d 006c 0020 0076 0065 .<.?.x.m.l. .v.e
0000010: 0072 0073 0069 006f 006e 003d 0027 0031 .r.s.i.o.n.=.'.1
0000020: 002e 0030 0027 0020 0065 006e 0063 006f ...0.'. .e.n.c.o
0000030: 0064 0069 006e 0067 003d 0027 0075 0074 .d.i.n.g.=.'.u.t
0000040: 0066 002d 0031 0036 0027 003f 003e 000d .f.-.1.6.'.?.>..
0000050: 0a00 3c00 6400 6100 7400 6100 3e00 0d0a ..<.d.a.t.a.>...
0000060: 0009 003c 0062 006c 0061 0068 003e 0062 ...<.b.l.a.h.>.b
0000070: 006c 0061 0068 003c 002f 0062 006c 0061 .l.a.h.<./.b.l.a
0000080: 0068 003e 000d 0a00 3c00 2f00 6400 6100 .h.>....<./.d.a.
0000090: 7400 6100 3e00 0d0a                                        t.a.>...

它不仅转换换行符(它不应该),而且它不尊重 utf-16 编码(不是我希望它知道它应该,它只是一个愚蠢的 FTP 管道)。如果不进行进一步处理以重新对齐字节,则结果是不可读的。我只会使用ASCII模式,但我的应用程序也将在同一管道中移动真实的二进制数据(mp3 文件和 jpeg 图像)。在这些二进制文件上使用BINARY传输模式还会导致它们在其内容中注入随机s,由于二进制数据通常包含合法序列0x0d,因此无法安全删除。0x0d0a如果我ASCII对这些文件使用模式,那么“聪明”0x0d0a0x0a

我想我的问题是(是):有没有人知道任何用于 java 的好的 FTP 库只是将该死的字节从那里移动到这里,或者我将不得不破解 apache commons-net-2.0 并维护我自己的 FTP 客户端代码只是为了这个简单的应用程序?有没有其他人处理过这种奇怪的行为?任何建议,将不胜感激。

我检查了 commons-net 源代码,它看起来不像BINARY是使用模式时奇怪行为的原因。但是InputStream它从 in 模式中读取的BINARY只是一个java.io.BufferedInptuStream包裹在一个 socketInputStream上。这些较低级别的 java 流是否做过任何奇怪的字节操作?如果他们这样做了,我会感到震惊,但我看不出这里还会发生什么。

编辑1:

这是一段模仿我下载文件的最小代码。要编译,只需执行

要运行,您需要目录 /tmp/ascii 和 /tmp/binary 以将文件下载到,以及设置有文件的 ftp 站点。代码还需要配置适当的 ftp 主机、用户名和密码。我将文件放在我的测试 ftp 站点上的 test/ 文件夹下,并调用文件 test.xml。测试文件至少应该多于一行,并且是 utf-16 编码的(这可能不是必需的,但有助于重现我的确切情况)。:set fileencoding=utf-16我打开一个新文件后使用了vim的命令,输入了上面引用的xml文本。最后,要运行,只需执行

代码:

(注意:此代码修改为使用自定义 FTPClient 对象,链接在下面的“编辑 2”下)

编辑2:

好的,我听从了CheckedXputStream建议,这是我的结果。我制作了 apache 的 call 的副本FTPClient,并将 the和 theMyFTPClient都包装在using校验和中。此外,我包装了我提供的以将输出存储在带有校验和的文件中。MyFTPClient 的代码发布在这里,我已经修改了上面的测试代码以使用这个版本的 FTPClient(试图发布一个 gist URL 到修改后的代码,但我需要 10 个信誉点才能发布多个 URL!),结果是:SocketInputStreamBufferedInputStreamCheckedInputStreamCRC32FileOutputStreamFTPClientCheckOutputStreamCRC32test.xmltest.mp3

这基本上是零意义,因为这里是相应文件的 md5sum:

我不知所措。我发誓我在这个过程中的任何时候都没有改变文件名/路径,并且我已经对每一步都进行了三次检查。它一定很简单,但我不知道下一步该往哪里看。出于实用性的考虑,我将继续调用 shell 进行我的 FTP 传输,但我打算继续这样做,直到我了解到底发生了什么。我会用我的发现更新这个帖子,我会继续感谢任何人可能做出的任何贡献。希望这在某些时候对某人有用!

0 投票
1 回答
2005 浏览

java - 具有大型二进制数据的 Hessian (java)

我正在寻找一个使用 Hessian (java) caucho 实现的大型二进制数据传输的完整示例。

我在哪里可以找到一个?

0 投票
2 回答
60314 浏览

python - Python在二进制文件中搜索和替换

我正在尝试搜索和替换此 pdf 表单文件(header.fdf,我认为这被视为二进制文件)中的一些文本(例如“Smith,John”):

出现以下错误:

如何最好地做到这一点?

0 投票
1 回答
1462 浏览

sql-server-2005 - 使用二进制数据创建初始数据 sqlscripts,sqlserver 2005

使用 TFS 2008 Teambuildtype,我们为我们的应用程序的审查版本创建了 ClickOnce 设置。在这个 Teambuildtype 中,我们创建了一个包含一些数据的初始数据库,以直接开始测试。

现在我需要在我们的 sql 脚本插入文件(Wordfiles)中放入一些二进制数据。

如何使用二进制数据创建初始脚本?我不能将二进制字符串放入脚本中,还是?

非常感谢

编辑:使用 OpenRowset 找到解决方案

0 投票
1 回答
679 浏览

binary - MIDI 程序更改事件

请查看Midi Event Commands,其中解释了某些事件(如 Program Change)只需要一个参数。

我的问题是,你会随这个事件的第二个参数的字节一起发送什么,是 0x00 吗?或者你只是从没有意义的事件中完全忽略它?

0 投票
2 回答
1799 浏览

c++ - 如何摆脱结构数据成员之间的填充字节

我有一个带有“消息”的二进制文件,我正在尝试使用结构将字节放入正确的变量中。在我的示例中,我使用了两种类型的消息:Tmessage 和 Amessage。

我运行程序时的输出:

程序正确地将字节放入 Tmessage 结构中。(0 5 54 0 0 62 72)
但是,在解析 Amessage 时发生了一些事情。
(0 1c 41 0 f 42 40 0 0 0 0 0 4 2f 76 53 0 0 3 e8 53 50 59 20 20 20 0 11 5 d0)

Lenght、MessageType 和 Timestamp 是正确的,但 OrderReferenceNumber 包含属于 BuySellIndicator 的“53”字节,然后其他变量不正确。

正确的 A 消息输出应该是:
长度:1c 0
消息类型:41
时间戳:40 42 f 0
OrderReferenceNumber:76 2f 4 0 0 0 0 0
BuySellIndicator:53
Shares:e8 3 0 0
Stock:53 50 59 20 20 20
Price : d0 5 11 0

2 个问题:a) 为什么 OrderReferenceNumber 包含“53”字节?b) 我认为“char Stock[6]”不起作用,因为在 Share 的字节和 Price 的字节之间有超过 6 个字节。如何将 6 个字节放入 char 向量或字符串中?

注意:我知道我必须交换字节,因为二进制数据是大端的。这就是为什么不应该交换“股票”的原因。非常感谢您的帮助!亲切的问候,

0 投票
1 回答
274 浏览

perl - 如何让 perl 脚本认为它在 64 位机器上运行?

如何让 Perl 脚本认为它在 64 位机器上运行?它需要对写在 64 位机器上的数据执行二进制解析,但需要在 32 位机器上解析(例如,通过参数标志)。在我的代码中,我使用带有格式的打包/解包'L!4'