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