首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将包装函数(如C/C++..bt(二进制模板))转换为Java 8

问将包装函数(如C/C++..bt(二进制模板))转换为Java 8
EN

Stack Overflow用户
提问于 2020-10-10 06:37:04
回答 1查看 106关注 0票数 3

对不起,我几乎有20年没有接触过C/C++了。

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

你可以读..。

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

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

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

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

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

代码语言:javascript
复制
APFS apfs(0);

我正在读C-函数在结构中,但是看起来,有很多不同的地方!

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

代码语言:javascript
复制
typedef struct APFS(uint64 apfs_offset) {
  DefineApfsContainer(apfs_offset);  
} ;

从行中可以看到1998

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-29 22:10:10

这段代码不能完全转换成Java,因为它是生成代码的代码。一些工具用来生成实际C类代码的代码(简单地说),或者用于定制虚拟机的代码,然后实现数据提取和数据打包。在Java中不编写独立工具的惯用方法是通过属性和类似的机制、内省和运行时代码生成来重新使用Java语法来表达相同的想法。您可以尝试进行手动翻译--这会使代码大量增加。二进制模板的概念是非常强大的-导致非常简洁的代码,否则将是冗长的实现。

我要说的是,手动翻译要比写翻译员要多,因为你要调试所有的手工错误,直到母牛回家。语法是有限的,因此用Java编写的解析器和翻译程序将与二进制模板的“直接”Java实现的行数大致相同。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64290713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档