模拟城市中文网

 找回密码
 入住
搜索
查看: 1909|回复: 6

DBPF文件描述翻译完成,翻译求指正

[复制链接]
发表于 2012-7-4 11:20 | 显示全部楼层 |阅读模式
RT。http://old-wiki.scunited.net/index.php?title=DBPF

评分

参与人数 1威望 +1 收起 理由
lrdcq + 1 精品文章

查看全部评分

发表于 2012-7-4 13:08 | 显示全部楼层

回复 1# 的帖子

不错不错……虽然对于会写程序的人,完全没有翻译的必要……另外,为毛我的手机点不开评分了==
回复 支持 反对

使用道具 举报

发表于 2012-7-4 13:15 | 显示全部楼层

回复 1# 的帖子

话说……源码的话,有一段perl源码可以传上去……我写的lua版的读写码库就是参考那个写的……毕竟perl天生看起来简洁,抄起来很方便
回复 支持 反对

使用道具 举报

发表于 2012-7-4 13:18 | 显示全部楼层
对了对了,还有个java版的…打包成jar库用的……考虑到java的跨平台性,把那个拉出来也不错
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-4 21:03 | 显示全部楼层
原帖由 lrdcq 于 2012-7-4 13:08 发表
不错不错……虽然对于会写程序的人,完全没有翻译的必要……另外,为毛我的手机点不开评分了==

原帖由 lrdcq 于 2012-7-4 13:15 发表
话说……源码的话,有一段perl源码可以传上去……我写的lua版的读写码库就是参考那个写的……毕竟perl天生看起来简洁,抄起来很方便

原帖由 lrdcq 于 2012-7-4 13:18 发表
对了对了,还有个java版的…打包成jar库用的……考虑到java的跨平台性,把那个拉出来也不错


(分了那么多楼 = =)

多谢提醒~~~~~~~~以及可能的话能否帮忙提供一下Perl及Java版的源码?感激不尽

(以及翻译成中文只是因为密集外语恐惧症而已 = =)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-4 21:42 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2012-7-5 19:46 | 显示全部楼层
PERL那段手上倒有
  1. #
  2. #  Parse a DBPF (Sims etc) file
  3. #

  4. use strict;

  5. my $i;
  6. my @cparray;

  7. if (@ARGV!=1) {
  8.   print <<"EOD";
  9. usage: sdat [whatever.package or whatever]

  10. Parses the given DBPF file, and says stuff about it.
  11. EOD
  12.   exit 100;
  13. }

  14. my $fn = $ARGV[0];

  15. print "Reading $fn.\n";

  16. open FH, "<$fn" or die "Error opening $fn; $!";
  17. binmode FH;

  18. my $fs = (stat FH)[7];

  19. print "$fn is $fs long.\n";

  20. my $data;

  21. my $dbpf;
  22. read FH,$dbpf,4;

  23. print qq#Magic number is "$dbpf".\n#;

  24. if ($dbpf ne "DBPF") {
  25.   print "  This is probably not a Maxis DBPF file.\n";
  26.   exit 29;
  27. } else {
  28.   print "  This is correct.\n";
  29. }

  30. read FH,$data,4;
  31. my $versionmajor = unpack "V", $data;
  32. print "Major version is: $versionmajor \n";

  33. read FH,$data,4;
  34. my $versionminor = unpack "V", $data;
  35. print "Minor version is: $versionminor \n";

  36. print "Unused: ";
  37. for (1..3) {
  38.   read FH,$data,4;
  39.   my $v = unpack "V", $data;
  40.   printf "%08x ", $v;
  41. }
  42. print "\n";

  43. read FH,$data,4;
  44. my $created = unpack "V", $data;
  45. printf "Created: %08x \n", $created;

  46. read FH,$data,4;
  47. my $modified = unpack "V", $data;
  48. printf "Modified: %08x \n", $modified;

  49. read FH,$data,4;
  50. my $iversion = unpack "V", $data;
  51. printf "Index version: %08x \n", $iversion;

  52. read FH,$data,4;
  53. my $ientries = unpack "V", $data;
  54. printf "Index entries: %08x \n", $ientries;

  55. read FH,$data,4;
  56. my $ioffset = unpack "V", $data;
  57. printf "Index offset: %08x \n", $ioffset;

  58. read FH,$data,4;
  59. my $isize = unpack "V", $data;
  60. printf "Index length: %08x \n", $isize;

  61. my $ientrylength = $isize / $ientries;
  62. printf "Index entry length: $ientrylength \n";

  63. read FH,$data,4;
  64. my $hrentries = unpack "V", $data;
  65. printf "Hold record entries: %08x \n", $hrentries;

  66. read FH,$data,4;
  67. my $hroffset = unpack "V", $data;
  68. printf "Hole record offset: %08x \n", $hroffset;

  69. read FH,$data,4;
  70. my $hrsize = unpack "V", $data;
  71. printf "Hole record length: %08x \n", $hrsize;

  72. #my $hrentrylength = $hrsize / $hrentries;
  73. #printf "Hole record entry length: $hrentrylength \n";

  74. read FH,$data,4;
  75. my $unk = unpack "V", $data;
  76. printf "Unknown: %08x \n", $unk;

  77. print "Unused: ";
  78. for (1..32) {
  79.   read FH,$data,1;
  80.   my $v = unpack "c", $data;
  81.   printf "%02x ", $v;
  82. }
  83. print "\n";

  84. seek FH,$ioffset,0;

  85. for (1..$ientries) {
  86.   printf "Index entry %08x: \n",$_;
  87.   my $typename;
  88.   my $typestring;
  89.   if ($ientrylength==24) {
  90.     read FH,$data,4;
  91.     $typename = unpack "V", $data;
  92.     $typestring = $data;
  93.   }
  94.   read FH,$data,4;
  95.   my $typeid = unpack "V", $data;
  96.   read FH,$data,4;
  97.   my $groupid = unpack "V", $data;
  98.   read FH,$data,4;
  99.   my $instid = unpack "V", $data;
  100.   if ($ientrylength==24) {
  101.     printf "  Type/group/instance IDs: %08x (%s) / %08x / %08x / %08x \n", $typename,$typestring,$typeid,$groupid,$instid;
  102.   } else {
  103.     printf "  Type/group/instance IDs: %08x / %08x / %08x / %08x \n", $typeid,$groupid,$instid;
  104.   }

  105.   read FH,$data,4;
  106.   my $offset = unpack "V", $data;
  107.   printf "  Offset: %08x \n", $offset;
  108.   read FH,$data,4;
  109.   my $size = unpack "V", $data;
  110.   printf "  Size: %08x \n", $size;

  111.   my $savepointer = tell FH;
  112.   my $decompressed_data;
  113.   seek FH,$offset,0;
  114.   read FH,$data,4;
  115.   my $bytes = unpack "N", $data;
  116.   printf "    First four bytes at offset: %08x \n", $bytes;
  117.   my $dword = unpack "V", $data;
  118.   if ($dword==$size) {
  119.     printf "    Probably a compressed file.\n";
  120.     print  "    Next five bytes: ";
  121.     for (1..5) {
  122.       read FH,$data,1;
  123.       my $v = unpack "C", $data;
  124.       printf "%02x ", $v;
  125.     }
  126.     print "\n";
  127.     $decompressed_data = try_decompress($dword-9);
  128.   } else {
  129.     printf "    Probably NOT a compressed file.\n";
  130.     $decompressed_data = $data;
  131.     read FH,$data,$size-4;
  132.     $decompressed_data .= $data;
  133.   }
  134.   open FHOUT,">f:\".$_.".out" or die "Failed to open output.";
  135.   binmode FHOUT;
  136.   print FHOUT $decompressed_data;
  137.   close FHOUT;
  138.   process_file($typeid,$decompressed_data,$ientrylength);
  139.   seek FH,$savepointer,0;
  140. }

  141. sub process_file {
  142.   my $ftype = shift;
  143.   my $indata = shift;
  144.   my $magicnumber = shift;
  145.   my $offsetbump = ($magicnumber==24) ? 20 : 16;
  146.   if ($ftype == 0xe86b1eef) {
  147.     print "      DIR file \n";
  148.     for (my $offset=0;$offset<length($indata);$offset+=$offsetbump) {
  149.       printf "      > Type ID: %08x\n",unpack "V",substr($indata,$offset);
  150.       printf "        Group ID: %08x\n",unpack "V",substr($indata,$offset+4);
  151.       printf "        Instance ID: %08x\n",unpack "V",substr($indata,$offset+8);
  152.       if ($magicnumber==24) {
  153.         printf "        Unknown ID: %08x\n",unpack "V",substr($indata,$offset+12);
  154.         printf "        Size: %08x\n",unpack "V",substr($indata,$offset+16);
  155.       } else {
  156.         printf "        Size: %08x\n",unpack "V",substr($indata,$offset+12);
  157.       }
  158.     }
  159.   }
  160. }

  161. sub try_decompress {
  162.   my $len = shift;
  163.   my $buf;
  164.   my $answer = "";
  165.   my $answerlen = 0;
  166.   my ($numplain,$numcopy,$offset);

  167.   my $sp = tell FH;
  168.   for (;$len>0;) {
  169.     read FH,$buf,1;
  170.     $len -= 1;
  171.     my $cc = unpack "C", $buf;
  172. #    printf "      Control char is %02x, len remaining is %08x. \n",$cc,$len;
  173.     if ($cc >= 0xfc) {
  174.       $numplain = $cc & 0x03;
  175.       $numplain = $len if ($numplain > $len);
  176.       $numcopy = 0;
  177.       $offset = 0;
  178.     } elsif ($cc >= 0xe0) {
  179.       $numplain = ($cc - 0xdf) << 2;
  180.       $numcopy = 0;
  181.       $offset = 0;
  182.     } elsif ($cc >= 0xc0) {
  183.       $len -= 3;
  184.       read FH,$buf,1;
  185.       my $byte1 = unpack "C", $buf;
  186.       read FH,$buf,1;
  187.       my $byte2 = unpack "C", $buf;
  188.       read FH,$buf,1;
  189.       my $byte3 = unpack "C", $buf;
  190.       $numplain = $cc & 0x03;
  191.       $numcopy = (($cc & 0x0c) <<6) + 5 + $byte3;
  192.       $offset = (($cc & 0x10) << 12 ) + ($byte1 << 8) + $byte2;
  193.     } elsif ($cc>=0x80) {
  194.       $len -= 2;
  195.       read FH,$buf,1;
  196.       my $byte1 = unpack "C", $buf;
  197.       read FH,$buf,1;
  198.       my $byte2 = unpack "C", $buf;
  199.       $numplain = ($byte1 & 0xc0) >> 6;
  200.       $numcopy = ($cc & 0x3f) + 4;
  201.       $offset = (($byte1 & 0x3f) << 8) + $byte2;
  202.     } else {
  203.       read FH,$buf,1;
  204.       $len -= 1;
  205.       my $byte1 = unpack "C", $buf;
  206.       $numplain = ($cc & 0x03);
  207.       $numcopy = (($cc & 0x1c) >> 2) + 3;
  208.       $offset = (($cc & 0x60) << 3) + $byte1;
  209.     }
  210. #    printf "      plain, copy, offset: $numplain, $numcopy, $offset \n";
  211.     $len -= $numplain;
  212.     read FH,$buf,$numplain;
  213.     $answer = $answer.$buf;
  214.     my $fromoffset = length($answer) - ($offset + 1);  # 0 == last char
  215.     for ($i=0;$i<$numcopy;$i++) {
  216.       $answer = $answer.substr($answer,$fromoffset+$i,1);
  217.     }
  218.     $answerlen += $numplain;
  219.     $answerlen += $numcopy;
  220.     if ($len<0) { printf "      UNDERFLOW \n"; }
  221.   }
  222.   printf "      Answer length is %08x (%08x). \n",$answerlen,length($answer);

  223.   seek FH,$sp,0;
  224.   return $answer;
  225. }
复制代码

评分

参与人数 1威望 +1 收起 理由
天唐永thianz + 1 热心

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 入住

本版积分规则

小黑屋|手机版|模拟城市中文网

GMT+8, 2024-5-14 07:17 , Processed in 0.022003 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表