将类似C/C++结构体包装函数的二进制模板(Binary Template)翻译为Java 8。

3

很抱歉,我已经有近20年没有接触过 C/C++ 了。

我想将这段代码翻译成 Java 8,我在这个参考手册中找到了它。 我是在这个链接中读到的。

你可以阅读...

二进制模板编写起来很容易,与 C/C++ 结构相似,只不过可能包含 if、for 或 while 语句以及函数或复杂表达式。

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

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

模板可以共享,在我们的模板库中可下载模板列表。

我开始并在第 2063 行找到了它(很抱歉,我只能翻译出悲伤的四行!)。

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?

1个回答

1
这段代码不太适合翻译成Java,因为它是生成代码的代码,即某些工具用来生成实际类似C代码的代码(简而言之),或者是为定制虚拟机编写数据提取和数据打包的代码。在Java中惯用的方式是通过属性和类似机制、内省和运行时代码生成来实现,重新利用Java语法表达相同的思想。你可以尝试进行手动翻译,但这将会增加很多代码量。二进制模板的概念非常强大,可以导致非常简洁的代码,否则实现起来将会很繁琐。
我认为手动翻译会比编写翻译器更费力,因为你需要调试所有手动错误,直到完成。语法足够有限,以至于在Java中编写的解析器和翻译器将与二进制模板的“直接”Java实现具有相同数量的代码行。
您可以查看此模板所适用的工具,看看该工具是否提供了翻译模板的方法。如果该工具是开源的,则已经有了解析器 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接