Java解析魔兽争霸3录像W3G文件(一):Header(二)

2014-11-24 07:14:22 · 作者: · 浏览: 2
ded game\u001A\0" String beginTitle = new String(fileBytes, 0, 28); System.out.println("1-28字节:" + beginTitle); if (!BEGIN_TITLE.equals(beginTitle)) { throw new W3GException("录像格式不正确。"); } // header部分总大小(版本小于或等于V1.06是0x40(64),版本大于或等于V1.07是0x44(68)) headerSize = LittleEndianTool.getUnsignedInt32(fileBytes, 28); System.out.println("29-32字节:" + headerSize); if (headerSize != 0x44) { throw new W3GException("不支持V1.06及以下版本的录像。"); } // 压缩文件大小 compressedDataSize = LittleEndianTool.getUnsignedInt32(fileBytes, 32); System.out.println("33-36字节:" + compressedDataSize); // header版本(版本小于或等于V1.06是0,版本大于或等于V1.07是1) headerVersion = LittleEndianTool.getUnsignedInt32(fileBytes, 36); System.out.println("37-40字节:" + headerVersion); if (headerVersion != 1) { throw new W3GException("不支持V1.06及以下版本的录像。"); } // 解压缩数据大小 uncompressedDataSize = LittleEndianTool.getUnsignedInt32(fileBytes, 40); System.out.println("41-44字节:" + uncompressedDataSize); // 压缩数据块数量 compressedDataBlockCount = LittleEndianTool.getUnsignedInt32(fileBytes, 44); System.out.println("45-48字节:" + compressedDataBlockCount); // WAR3:非冰封王座录像,W3XP冰封王座录像 versionIdentifier = LittleEndianTool.getString(fileBytes, 48, 4); System.out.println("49-52字节:" + versionIdentifier); // 版本号(例如1.24版本对应的值是24) versionNumber = LittleEndianTool.getUnsignedInt32(fileBytes, 52); System.out.println("53-56字节:" + versionNumber); // Build号 buildNumber = LittleEndianTool.getUnsignedInt16(fileBytes, 56); System.out.println("57-58字节:" + buildNumber); // 单人游戏(0x0000) 多人游戏(0x8000,对应十进制32768) flag = LittleEndianTool.getUnsignedInt16(fileBytes, 58); System.out.println("59-60字节:" + flag); // 录像时长(毫秒) duration = LittleEndianTool.getUnsignedInt32(fileBytes, 60); System.out.println("61-64字节:" + duration); // CRC32校验码 long crc32 = LittleEndianTool.getUnsignedInt32(fileBytes, 64); System.out.println("65-68字节:" + crc32); // 这里来校验CRC32,将最后四位也就是CRC32所在的四个字节设为0后计算CRC32的值 CRC32 crc32Tool = new CRC32(); crc32Tool.update(fileBytes, 0, 64); crc32Tool.update(0); crc32Tool.update(0); crc32Tool.update(0); crc32Tool.update(0); System.out.println("计算CRC32:" + crc32Tool.getValue()); // 判断Header中后四位读取的CRC32的值和计算得到的值比较,看是否一致 if (crc32 != crc32Tool.getValue()) { throw new W3GException("Header部分CRC32校验不通过。"); } } public long getHeaderSize() { return headerSize; } public long getCompressedDataSize() { return compressedDataSize; } public long getHeaderVersion() { return headerVersion; } public long getUncompressedDataSize() { return uncompressedDataSize; } public long getCompressedDataBlockCount() { return compressedDataBlockCount; } public String getVersionIdentifier() { return versionIdentifier; } public long getVersionNumber() { return versionNumber; } public int getBuildNumber() { return buildNumber; } public int getFlag() { return flag; } public long getDuration() { return duration; } }
Header中用到了LittleEndianTool是用来按小字节序读取数据的工具类。

LittleEndianTool.java

package com.xxg.w3gparser;

/**
 * Little-Endian(小字节序)工具类
 * @author 叉叉哥(806223819@q