gpt4 book ai didi

c++ - 将包装函数(如 C/C++.bt(二进制模板)的结构)转换为 Java 8

转载 作者:行者123 更新时间:2023-12-03 07:23:18 27 4
gpt4 key购买 nike

抱歉,我已经将近 20 年没有接触 C/C++

我想翻译 this Java 8 的代码,我发现了这个 Reference Manual .我在这个 link 中读到.

你可以阅读...

二进制模板易于编写并且看起来类似于 C/C++ 结构,只是它们可能包含 if、for 或 while 语句以及函数或复杂表达式。

强大到足以解析几乎任何二进制文件格式。

可以设置为在打开文件时自动运行。

可以共享模板,我们的模板存储库中提供了可供下载的模板列表。

我开始并在我找到的 2063 行中(抱歉,我只能翻译,可悲的是 4 行 :(!)。

APFS apfs(0);

我正在阅读 C - function inside struct但是看起来,这么多不同!

回顾一下,我跳转到了 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?

最佳答案

此代码不能完全转换为 Java,因为它是代码生成代码,即。一些工具用来生成实际的类 C 代码(简而言之)的代码,或者用于随后实现数据提取和数据打包的定制虚拟机的代码。在 Java 中执行此操作而无需编写独立工具的惯用方法是通过属性和类似机制、内省(introspection)和运行时代码生成,重新利用 Java 语法来表达相同的想法。您可以尝试进行手动翻译 - 这会大大增加代码。二进制模板概念非常强大 - 导致非常简洁的代码,否则实现起来会很乏味。

我会说手动翻译比编写翻译器更费力,因为您将调试所有手动错误,直到奶牛回家。语法非常有限,因此用 Java 编写的解析器和翻译器的行数与二进制模板的“直接”Java 实现的行数大致相同。

您可以查看为该模板编写的工具,看看该工具是否提供了一种翻译模板的方法。如果该工具是开源的,那么您已经有了一个解析器:)

关于c++ - 将包装函数(如 C/C++.bt(二进制模板)的结构)转换为 Java 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64290713/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com