我的问题是,我想用一个在JAVA中实现的通用解析器来解析不同类型的二进制文件.也许用一个配置文件来描述文件格式,该配置文件由解析器读取或创建根据某种解析规则解析文件的Java类.
我在互联网上搜索了很多,但在这个主题上几乎找不到任何东西.
我发现的只是处理编译器生成器(Jay,Cojen等)的事情,但我认为我不能用它们来生成解析二进制文件的东西.但我在这个假设上可能是错的.
是否有任何框架特别容易解析二进制文件,或者任何人都可以提示我如何使用解析器/编译器生成器这样做?
更新:我正在寻找可以编写配置文件的东西
file:
header: FIXED("MAGIC")
body: content(10)
content:
value1: BYTE
value2: LONG
value3: STRING(10)
Run Code Online (Sandbox Code Playgroud)
它会自动生成一些东西来解析以"MAGIC"开头的文件,然后是内容包的十倍(它本身由一个字节,一个长字节和一个10字节的字符串组成).
Update2:我发现了一些类似我正在寻找的东西," 构造 ",但遗憾的是这是一个Python框架.也许这有助于某人获得一个想法,我正在寻找什么.
我被赋予了完善编解码器库接口的任务。我们使用的是C ++ 17,我只能使用标准库(即没有Boost)。当前,有一Decoder类大致如下所示的类:
class Decoder : public Codec {
public:
struct Result {
vector<uint8_t>::const_iterator new_buffer_begin;
optional<Metadata> metadata;
optional<Packet> packet;
};
Result decode(vector<uint8_t>::const_iterator buffer_begin,
vector<uint8_t>::const_iterator buffer_end);
private:
// irrelevant details
};
Run Code Online (Sandbox Code Playgroud)
调用者实例化一个Decoder,然后通过以下方式将数据流馈送到解码器:
从文件中读取大量数据(但将来可能还会有其他来源),并将其附加到vector<uint8_t>。
调用该decode函数,并为其向量传递迭代器。
如果返回Result的new_buffer_begin与buffer_begin传递给的相同,则decode意味着缓冲区中没有足够的数据来解码任何内容,并且调用方应返回到步骤1。否则,调用方将使用已解码的Metadata或Packet对象。 ,然后返回到步骤2,new_buffer_begin用于下一遍。
我对这个介面不满意,需要改善的地方:
使用vector<uint8_t>::const_iterator似乎过于具体。有没有更通用的方法不强制调用者使用vector?我当时正在考虑仅使用C风格的界面;一个uint8_t *和一个长度。有没有相当通用的C ++替代品?
如果有足够的数据来解码某些内容,则只有metadata 或 packet将有一个值。我认为std::variant2个回调(每种类型一个)将使此代码更具自说明性。我不确定哪个更惯用。每种方法的优缺点是什么,是否有更好的方法?
对音频和视频文件进行大量二进制文件编辑的最佳方法是什么?Git似乎并不真正设计用于处理大量二进制文件.
另一个问题是内容产生不一定要学习如何使用开发人员的工具,如Git.
有没有人找到像Git这样的基于文本的版本系统的好的二进制版本伴侣?游戏开发者通常做什么?内容在很多情况下都没有版本化吗?在这种情况下,集中式SCM的工作是否更好?
我不是DBA,所以我不知道使用各种方法在SQL Server中存储二进制数据的好处和缺点.
varbinary(n) 只存储8000个字节varbinary(max) 商店2 GBBLOBs用于大文件,但带有"管理"开销(文件仅在数据库中引用,但实际上位于本地硬盘上)我基本上有大约1000个文档(每年),我想存储在SQL Server 2008 R2数据库中(填充简单的ASPX表单上传,通过简单的Gridview查看下载).所有文档可能大约2MB - 8MB(Word,Excel文件).我的猜测是我应该使用MyDocuments具有以下布局的表:
MyDocuments
Data varbinary(max)
Title varchar(255)
ModifiedOn datetime()
ModifiedBy varchar(100)
Run Code Online (Sandbox Code Playgroud)
我在跟踪varbinary(max)吗?或者我是否朝着错误的方向前进(例如,表现方面)?
我正在尝试将数据写入二进制格式的文件以进行压缩.数据完全由浮点组成,因此我决定将数据量化为0到65535之间的整数,这样数据就可以写成两位无符号整数,最终节省空间.但是,我需要将量化数据输出到二进制文件而不是人类可读的Ascii.
目前这就是我正在做的事情
@param output将包含已经量化的数据的文件作为.txt文件中的字符串
public void generateBinaryRioFile(String materialLibrary,
String outputFile, String group, String mtlAux) {
try {
// Create file
FileWriter fileStream = new FileWriter(outputFile);
try {
BufferedReader br = new BufferedReader(new FileReader(new File(
"idx.txt")));
while ((line = br.readLine()) != null) {
writer.write(line + "\n");
}
try {
br.close();
} catch (FileNotFoundException e) {
e.getMessage();
} catch (IOException e) {
e.printStackTrace();
} BufferedWriter writer = new BufferedWriter(fileStream);
Run Code Online (Sandbox Code Playgroud)
但是,它将文件写为人类可读的字符串.我需要将它写成二进制数据.如何在Java中实现这一目标?
我的程序执行将二进制数据写入文件的常见任务,符合某种非文本文件格式.由于我正在编写的数据不是已经在现有的块中,而是在运行时逐字节放在一起,我使用std::ostream::put()而不是write().我认为这是正常的程序.
该程序工作得很好.它使用两个std::stringstream::put()和std::ofstream::put()两位十六进制整数作为参数.但是只要参数to put()大于0x7f,我就会得到编译器警告C4309:"截断常量值"(在VC++ 2010中).显然编译器期望a signed char,并且常量超出范围.但我认为任何截断都不会发生; 字节的写入就像它应该的那样.
编译器警告让我觉得我没有以正常,可接受的方式做事.我描述的情况必须是一个普遍的情况.是否有通用的方法来避免这样的编译器警告?或者这是一个无意义的编译器警告的例子,应该被忽略?
我想到了避免它的两种不公平的方法.我可以mystream.put( char(0xa4) )在每次调用时都使用语法.或者不是使用std::stringstream我可以使用std::basic_stringstream< unsigned char >,但我不认为这个技巧可以使用std::ofstream,这不是模板类型.我觉得这里应该有一个更好的解决方案,特别是因为ofstream它用于编写二进制文件.
你的意见?
- 编辑 -
啊,我错误地认为它std::ofstream不是一个模板化的类型.实际上std::basic_ofstream<char>,但我尝试了这种方法并且意识到它无论如何都不会因缺乏定义的方法和多态不兼容而起作用std::ostream.
这是一个代码示例:
stringstream ss;
int a, b;
/* Do stuff */
ss.put( 0 );
ss.put( 0x90 | a ); // oddly, no warning here...
ss.put( b ); // ...or here
ss.put( 0xa4 ); // …Run Code Online (Sandbox Code Playgroud) 我正在寻找脚本(或更高级别的编程)语言(或者例如Python或类似语言的模块),以便毫不费力地分析和操作文件中的二进制数据(例如核心转储),就像Perl允许非常流畅地操作文本文件一样.
我想要做的事情包括以各种形式(二进制,十进制,十六进制)呈现数据的任意块,将数据从一个endianess转换为另一个endianess,等等.也就是说,你通常会使用C或汇编的东西,但我是寻找一种语言,允许非常快速地编写一小段代码用于高度特定的一次性目的.
有什么建议?
首先,我知道这个问题:
特别是最好的答案,http://emilsblog.lerch.org/2009/07/javascript-hacks-using-xhr-to-load.html.
因此,使用Firefox(以及以后版本的Chrome实际上似乎也可以使用的操作系统)从Javascript访问二进制数据;不了解Opera.到现在为止还挺好.但我仍然希望找到一种方法来使用现代IE(理想情况下是IE 6,但至少是IE 7+)访问二进制数据,而不使用VB.有人提到XHR.messageBody不起作用(如果它包含零字节),但我想知道这是否可以用更新版本解决; 或者是否有可能允许简单二进制数据访问的备用设置.
我的具体用例是访问使用二进制数据传输格式(包括UTF-8编码中不合法的字节组合)编码的Web服务返回的数据.
javascript ajax internet-explorer xmlhttprequest binary-data
我有一个MySQL数据库,其中包含一个带二进制类型列的表.我希望能够投射该列而不必通过它,例如,HEX().是否mysqlCLI工具有一个配置选项或其他手段的方式,不会为我的控制台输出任意字节在热闹的/恼人的方式来解释显示二进制数据的表示?
在R中,我想生成离散随机变量的随机样本:X,其中:P(X=a)=P(X=-a)=1/2.我一直在网上搜索功能,但似乎没有直接的功能这样做.
binary-data ×10
c++ ×2
file-io ×2
java ×2
ajax ×1
c++17 ×1
console ×1
fileparsing ×1
git ×1
idiomatic ×1
javascript ×1
mysql ×1
parsing ×1
patch ×1
r ×1
scripting ×1
truncation ×1
types ×1