UnSXE.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. /*
  2. * To change this template, choose Tools | Templates
  3. * and open the template in the editor.
  4. */
  5. package QuickVerifyCrap;
  6. import java.io.FileNotFoundException;
  7. import java.io.IOException;
  8. import java.io.RandomAccessFile;
  9. /**
  10. *
  11. * @author LH
  12. */
  13. public class UnSXE
  14. {
  15. /**
  16. * @param args the command line arguments
  17. */
  18. public static void main(String[] args)
  19. {
  20. if(args.length>0)
  21. {
  22. //String filename = args[0];
  23. String filename = args[0];
  24. try
  25. {
  26. RandomAccessFile rf = new RandomAccessFile(filename, "r");
  27. //boolean SXET_ALT = false;
  28. //detect SXE variant
  29. char c1 = (char) rf.readUnsignedByte();
  30. char c2 = (char) rf.readUnsignedByte();
  31. char c3 = (char) rf.readUnsignedByte();
  32. char c4 = (char) rf.readUnsignedByte();
  33. String magix = ((Character)c1).toString()+((Character)c2).toString()+((Character)c3).toString()+((Character)c4).toString();
  34. System.out.println(magix);
  35. long i, b1,b2,b3,b4;
  36. if(magix.equals("SXET"))
  37. {
  38. int j;
  39. rf.seek(12);//hardcoded cause the first file offset lies there
  40. b1 = rf.readUnsignedByte();
  41. b2 = rf.readUnsignedByte()*256;
  42. b3 = rf.readUnsignedByte()*256*256;
  43. b4 = rf.readUnsignedByte()*256*256*256;
  44. long headerSize = b1+b2+b3+b4;
  45. b1 = rf.readUnsignedByte();
  46. b2 = rf.readUnsignedByte()*256;
  47. b3 = rf.readUnsignedByte()*256*256;
  48. b4 = rf.readUnsignedByte()*256*256*256;
  49. long filesPerArchive = b1+b2+b3+b4;
  50. rf.seek(rf.getFilePointer()+16);//3 dwords of trash
  51. b1 = rf.readUnsignedByte();
  52. b2 = rf.readUnsignedByte()*256;
  53. b3 = rf.readUnsignedByte()*256*256;
  54. b4 = rf.readUnsignedByte()*256*256*256;
  55. //long tailOffset = b1+b2+b3+b4+headerSize+12;
  56. long start = headerSize+12;
  57. String[] filenames = new String[(int)filesPerArchive];
  58. long[] offsets = new long[(int)filesPerArchive];
  59. long[] fileends = new long[(int)filesPerArchive];
  60. rf.seek(rf.getFilePointer()+filesPerArchive*64);
  61. //for (j = 0; j < filesPerArchive*64; j++)
  62. //{
  63. //b1 = rf.readUnsignedByte();//skip metadata
  64. /*b1 = rf.readUnsignedByte();
  65. b1 = rf.readUnsignedByte();
  66. b1 = rf.readUnsignedByte();
  67. b1 = rf.readUnsignedByte();
  68. b2 = rf.readUnsignedByte()*256;
  69. b3 = rf.readUnsignedByte()*256*256;
  70. b4 = rf.readUnsignedByte()*256*256*256;
  71. long id = b1+b2+b3+b4;
  72. for (int k = 0; k < 16; k++)
  73. {
  74. rf.readUnsignedByte();//skipping 4 dwords of trash;
  75. }
  76. */
  77. //
  78. b1 = rf.readUnsignedByte();
  79. b2 = rf.readUnsignedByte()*256;
  80. b3 = rf.readUnsignedByte()*256*256;
  81. b4 = rf.readUnsignedByte()*256*256*256;
  82. long tailOffset = b1+b2+b3+b4+headerSize+12;
  83. rf.seek(rf.getFilePointer()+12);//3 dwords of trash
  84. for (j = 0; j < filesPerArchive; j++)
  85. {
  86. rf.seek(rf.getFilePointer()+8);
  87. b1 = rf.readUnsignedByte();
  88. b2 = rf.readUnsignedByte()*256;
  89. b3 = rf.readUnsignedByte()*256*256;
  90. b4 = rf.readUnsignedByte()*256*256*256;
  91. offsets[j] = b1+b2+b3+b4+start+8;
  92. }
  93. for (j = 0; j < filesPerArchive-1; j++)
  94. {
  95. fileends[j] = offsets[j+1];
  96. }
  97. fileends[(int)filesPerArchive-1]=tailOffset;
  98. rf.seek(tailOffset+8);
  99. for (j = 0; j < filesPerArchive; j++)//getFileNames
  100. {
  101. rf.seek(rf.getFilePointer()+4);
  102. b1 = rf.readUnsignedByte();
  103. b2 = rf.readUnsignedByte()*256;
  104. b3 = rf.readUnsignedByte()*256*256;
  105. b4 = rf.readUnsignedByte()*256*256*256;
  106. int stringsize= (int) (b1+b2+b3+b4);
  107. String fn = "";
  108. for (int k = 0; k < stringsize; k++)
  109. {
  110. fn += ((Character)((char) rf.readUnsignedByte())).toString();
  111. }
  112. filenames[j] = fn+".dds";
  113. }
  114. for (j = 0; j < offsets.length; j++)
  115. {
  116. RandomAccessFile rft = new RandomAccessFile(filename+"_"+filenames[j], "rw");
  117. long fs = fileends[j]-offsets[j];
  118. rf.seek(offsets[j]);
  119. while(fs>1)
  120. {
  121. byte[] b = new byte[2048];
  122. if(fs<2048)
  123. b=new byte[(int)fs];
  124. fs-=b.length;
  125. rf.read(b);
  126. rft.write(b);
  127. }
  128. }
  129. System.out.println("HS"+headerSize);
  130. System.out.printf("%8h", headerSize);
  131. System.out.println();
  132. System.out.println("FC"+filesPerArchive);
  133. System.out.printf("%16h", filesPerArchive);
  134. System.out.println();
  135. /*
  136. }
  137. if(SXET_ALT)
  138. {
  139. while(!(rf.length()==rf.getFilePointer()))
  140. {
  141. long b1 = rf.readUnsignedByte();
  142. long b2 = rf.readUnsignedByte()*256;
  143. long b3 = rf.readUnsignedByte()*256*256;
  144. long b4 = rf.readUnsignedByte()*256*256*256;
  145. System.out.println(b1);
  146. System.out.println(b2);
  147. System.out.println(b3);
  148. System.out.println(b4);
  149. long i = b1+b2+b3+b4;
  150. boolean alternate=false;
  151. if(i==0)
  152. {
  153. b1 = rf.readUnsignedByte();
  154. b2 = rf.readUnsignedByte()*256;
  155. b3 = rf.readUnsignedByte()*256*256;
  156. b4 = rf.readUnsignedByte()*256*256*256;
  157. System.out.println(b1);
  158. System.out.println(b2);
  159. System.out.println(b3);
  160. System.out.println(b4);
  161. i = b1+b2+b3+b4;
  162. alternate=true;
  163. }
  164. long fo = rf.getFilePointer();
  165. if((((long)i)+fo)>rf.length())//SXe footer detector
  166. break;
  167. System.out.println(i);
  168. System.out.printf("%8h", i);
  169. System.out.println();
  170. System.out.println(fo);
  171. System.out.printf("%16h", fo);
  172. System.out.println();
  173. byte[] datadump = new byte[(int)i];
  174. if(!alternate)
  175. rf.seek(fo+4);
  176. rf.read(datadump);
  177. fo = rf.getFilePointer();
  178. rf.seek(fo-4);
  179. if(!alternate)
  180. rf.seek(fo-8);
  181. RandomAccessFile trg = new RandomAccessFile(filename+".id"+fo+".dds", "rw");
  182. trg.write(datadump, 0, (int)i);
  183. trg.close();
  184. }
  185. */
  186. }
  187. else
  188. {
  189. while(!(rf.length()==rf.getFilePointer()))
  190. {
  191. /*long */b1 = rf.readUnsignedByte();
  192. /*long */b2 = rf.readUnsignedByte()*256;
  193. /*long */b3 = rf.readUnsignedByte()*256*256;
  194. /*long */b4 = rf.readUnsignedByte()*256*256*256;
  195. System.out.println(b1);
  196. System.out.println(b2);
  197. System.out.println(b3);
  198. System.out.println(b4);
  199. /*long */ i = b1+b2+b3+b4;
  200. long fo = rf.getFilePointer();
  201. if((((long)i)+fo)>rf.length())//SXe footer detector
  202. break;
  203. System.out.println(i);
  204. System.out.printf("%8h", i);
  205. System.out.println();
  206. System.out.println(fo);
  207. System.out.printf("%16h", fo);
  208. System.out.println();
  209. byte[] datadump = new byte[(int)i];
  210. rf.read(datadump);
  211. RandomAccessFile trg = new RandomAccessFile(filename+".id"+fo+".dds", "rw");
  212. trg.write(datadump, 0, (int)i);
  213. trg.close();
  214. }
  215. }
  216. }
  217. catch (FileNotFoundException ex)
  218. {
  219. ex.printStackTrace();
  220. }
  221. catch (IOException ex)
  222. {
  223. ex.printStackTrace();
  224. }
  225. }
  226. }
  227. }