C++ 翻译C/C+结构等包装函数+;。bt(二进制模板)到Java 8

C++ 翻译C/C+结构等包装函数+;。bt(二进制模板)到Java 8,c++,struct,java-8,C++,Struct,Java 8,对不起,我有将近20年没有接触过C/C++ 我想把代码翻译成Java8,我发现了这个。 我在这本书里读到的 你可以阅读 二进制模板易于编写,看起来与C/C++结构相似,只是它们可能包含if、for或while语句以及函数或复杂表达式 强大到足以解析几乎任何二进制文件格式 可以设置为在打开文件时自动运行 模板可以共享,可在我们的模板存储库中下载模板列表 我开始了,在我找到的2063行中(对不起,我只能翻译,悲伤的4行:(!) 我在看书,但是看起来,太多不同了 回顾一下,我跳转到1994,它看起来像

对不起,我有将近20年没有接触过
C/C++

我想把代码翻译成Java8,我发现了这个。 我在这本书里读到的

你可以阅读

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

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

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

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

我开始了,在我找到的
2063
行中(对不起,我只能翻译,悲伤的4行:(!)

我在看书,但是看起来,太多不同了

回顾一下,我跳转到
1994
,它看起来像一个带有函数调用的结构,而不是具有属性

在中间,您可以在
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!
  }*/
}
void DefineApfsContainer(uint64 apfs\u偏移量){
Apfs_Offset=Apfs_Offset;
FSeek(Apfs\u偏移量);
如果(!CheckApfsAndSetBlockSize()){
Printf(“\n错误,起点不是APFS容器超级块。请将“APFS\u Offset”变量设置为正确的值!”);
出口(1);
}
obj csb;//块零中的容器超级块
SeekBlock(csb.body.xp\u desc\u base);
CheckpointDesc cp(csb.body.xp_desc_块);
//SeekBlock(csb.body.xp_数据库);
//obj检查点数据块[csb.body.xp_data_blocks];
//检查点处理
局部uint i=0;
本地uint64最大值=0;
本地uint64最大xid块位置=0;
SeekBlock(csb.body.xp\u desc\u base);
本地uint64 base_pos=FTell();
本地uint64位置=0;
对于(i=0;i=max\u xid){
//验证它
pos=基本位置+(i*块大小);
如果(fletcher64(位置,块大小)==0){
max_xid=cp.checkpoint_desc_nx[i].hdr.xid;
最大西德区块位置=位置;
}
}
}
}
如果(最大值xid>csb.hdr.xid)
Printf(“\n找到较新的xid=%Lu@offset 0x%Lu。使用此容器超级块。”,max\u xid,pos);
FSeek(pos);
obj有效_csb;
书签卷(有效的\u csb);
if(有效\u csb.body.efi\u jumpstart){
SeekBlock(有效的csb.body.efi\u跳线启动);
obj efi_信息;
}
/*if(有效的锁体锁块计数){
SeekBlock(有效的锁体、锁芯);
obj keybag;//这是加密的!
}*/
}
为了翻译,我需要理解这是什么(我不是指代码,而是编码的方式)。 我应该如何理解此代码(函数作为结构或函数的结构)?

主题的精华。
我应该如何将其翻译成Java?

此代码不能完全翻译成Java,因为它是代码生成代码,即某些工具用来生成实际C类代码的代码(简而言之),或定制虚拟机的代码,然后实现数据提取和数据打包。在Java中实现这一点而无需编写独立工具的惯用方法是通过属性和类似机制、内省和运行时代码生成,重新调整Java语法的用途以表达相同的想法。您可以尝试手动翻译二元模板的概念非常强大,它会产生非常简洁的代码,否则实现起来会非常繁琐

我认为手动翻译比编写翻译器更费事,因为在奶牛回家之前,你将调试所有手动错误。语法是有限的,因此用Java编写的解析器和翻译器的行数与“直截了当”的行数差不多二进制模板的Java实现

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

typedef struct APFS(uint64 apfs_offset) {
  DefineApfsContainer(apfs_offset);  
} ;
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!
  }*/
}