对不起,我几乎有20年没有接触过C/C++了。
我想把这代码翻译成Java 8,我找到了这个参考手册。我是在链接上读到的。
你可以读..。
二进制模板易于编写,看起来类似于C/C++结构,除非它们可能包含if、for或while语句以及函数或复杂表达式。
强大到足以解析几乎任何二进制文件格式。
可以设置为打开文件时自动运行。
模板可以共享,模板下载的列表可以在我们的模板库中找到。
我开始,在我找到的行2063 (对不起,我只能翻译,悲伤4行:(!)
APFS apfs(0);我正在读C-函数在结构中,但是看起来,有很多不同的地方!
回顾一下我跳转到行1994,它看起来像一个带有函数调用的结构,而不是拥有属性!
typedef struct APFS(uint64 apfs_offset) {
DefineApfsContainer(apfs_offset);
} ;从行中可以看到1998
void DefineApfsContainer(uint64 apfs_offset) {
Apfs_Offset = apfs_offset;
FSeek(Apfs_Offset);
if (!CheckApfsAndSetBlockSize()) {
Printf("\nError, starting point not an APFS container superblock. Set the 'Apfs_Offset' variable to correct value!");
Exit(1);
}
obj csb;//container super block in block zero
SeekBlock(csb.body.xp_desc_base);
CheckpointDesc cp(csb.body.xp_desc_blocks);
//SeekBlock(csb.body.xp_data_base);
//obj checkpoint_data_nx[csb.body.xp_data_blocks] <optimize=false>;
// Checkpoint processing
local uint i = 0;
local uint64 max_xid = 0;
local uint64 max_xid_block_pos = 0;
SeekBlock(csb.body.xp_desc_base);
local uint64 base_pos = FTell();
local uint64 pos = 0;
for (i=0; i< csb.body.xp_desc_blocks; ++i) { // assuming cont. blocks
if (cp.checkpoint_desc_nx[i].hdr.type == obj_type_container_superblock) {
if (cp.checkpoint_desc_nx[i].hdr.xid >= max_xid) {
// validate it
pos = base_pos + (i * Block_Size);
if (fletcher64(pos, Block_Size) == 0) {
max_xid = cp.checkpoint_desc_nx[i].hdr.xid;
max_xid_block_pos = pos;
}
}
}
}
if (max_xid > csb.hdr.xid)
Printf("\nFound newer xid=%Lu @ offset 0x%Lu. Using this Container superblock.", max_xid, pos);
FSeek(pos);
obj valid_csb;
BookmarkVolumes(valid_csb);
if (valid_csb.body.efi_jumpstart) {
SeekBlock(valid_csb.body.efi_jumpstart);
obj efi_info;
}
/*if (valid_csb.body.keylocker_block_count) {
SeekBlock(valid_csb.body.keylocker_paddr);
obj keybag; // This is encrypted!
}*/
}我需要理解这是什么(我指的不是代码,而是编码的方式),以便进行翻译。如何理解这段代码(函数是结构,还是函数的结构)?
主题的核心。如何将它翻译成Java?
发布于 2020-11-29 22:10:10
这段代码不能完全转换成Java,因为它是生成代码的代码。一些工具用来生成实际C类代码的代码(简单地说),或者用于定制虚拟机的代码,然后实现数据提取和数据打包。在Java中不编写独立工具的惯用方法是通过属性和类似的机制、内省和运行时代码生成来重新使用Java语法来表达相同的想法。您可以尝试进行手动翻译--这会使代码大量增加。二进制模板的概念是非常强大的-导致非常简洁的代码,否则将是冗长的实现。
我要说的是,手动翻译要比写翻译员要多,因为你要调试所有的手工错误,直到母牛回家。语法是有限的,因此用Java编写的解析器和翻译程序将与二进制模板的“直接”Java实现的行数大致相同。
您可以查看此模板编写的工具,并查看该工具是否提供了转换模板的方法。如果该工具是开源的,那么您已经有了一个解析器:)
https://stackoverflow.com/questions/64290713
复制相似问题