This is an old revision of the document!
SC2Inspector
Project Log
12/28/2011 @ 23:46
Ok, so I've gotten a decent amount done. I was looking at code for an MPQ parser and it looks like the SC2Replay files have a slightly different format. They start with MPQ\x1B then 1024 bytes into the file have another MPQ\x1A which actually starts the normal MPQ file. MPQ1B seems to be a StarCraft II only option for displaying additional metadata without having to read the file.
Using the following data taken from a random SC2Replay:
I was able to determine the following:
Attribute | Location (d) | Hex Value | Interpretation |
---|---|---|---|
Id | x0-x3 | 4D 50 51 1B | MPQ\x1B |
UserDataMaxSize | x4-x7 | 00 02 00 00 | 512 |
HeaderOffset | x8-x11 | 00 04 00 | 1024 |
UserDataSize | x12-x15 | 3C 00 00 00 | 60 |
DataType | x16 | 05 | DataType indicated upcomming data is of type Array with keys |
NumberOfElements | x17 | 08 | Indicates 4 elements in array (VLF) |
Index | x18 | 00 | Sets index to 0 |
DataType | x19 | 02 | DataType indicated upcomming data is of type Binary Data |
NumberOfElements | x20 | 2C | Indicates 22 elements in the upcomming array |
StarCraftII | x21-x42 | 53 74 61 72 43 72 61 66 74 20 49 49 20 72 65 70 6C 61 79 1B 31 31 | A bunch of hex values which resolve to a byte array of ASCII values which end up as “Starcraft II Replay 11” |
Index | x43 | 02 | Sets index to 1 |
DataType | x44 | 05 | DataType indicated upcomming data is of type Array with keys |
NumberOfElements | x45 | 0C | Indicates 6 elements in array (VLF) |
Index | x46 | 00 | Sets index to 0 |
DataType | x47 | 09 | DataType indicated upcomming data is of type VLF |
Version | x48 | 02 | Major Version |
Index | x49 | 02 | Sets index to 1 |
DataType | x50 | 09 | DataType indicated upcomming data is of type VLF |
Version | x51 | 02 | Minor Version |
Index | x52 | 04 | Sets index to 2 |
DataType | x53 | 09 | DataType indicated upcomming data is of type VLF |
Version | x54 | 00 | Patch Version |
Index | x55 | 06 | Sets index to 3 |
DataType | x56 | 09 | DataType indicated upcomming data is of type VLF |
Version | x57 | 00 | Revision Version |
Index | x58 | 08 | Sets index to 4 |
DataType | x59 | 09 | DataType indicated upcomming data is of type VLF |
Version | x60 | EA | Build Version |
Unknown | x61-x75 | FB 01 0A 09 DA F0 01 04 09 04 06 09 FE 9E 05 FB | I'm unsure after this part. Nothing seems to add up correctly. |
VLF represents a “Variable Length Format” integer.
Additionally, SC2Replay files have a quirk concerning the way integers are stored. An integer consists of a variable number of bytes in Big Endian order. When parsing an integer, the first i.e. most significant bit of a byte indicates that the succeeding byte is counted towards the integer's value. After parsing all bytes of a number, the least significant bit of the result indicates the sign. Extract this bit and shift the number's value to the right by one. If the bit is set, change the sign to negative, otherwise leave it positive.
Source: http://trac.erichseifert.de/warp/wiki/SC2ReplayFormat#VariableLengthFormat
I've taken the following code from a C# SC2Replay client to do this VLF for me:
private static int ParseVLFNumber(BinaryReader reader) { var bytes = 0; var first = true; var number = 0; var multiplier = 1; while (true) { var i = reader.ReadByte(); number += (i & 0x7F) * (int)Math.Pow(2, bytes * 7); if (first) { if ((number & 1) != 0) { multiplier = -1; number--; } first = false; } if ((i & 0x80) == 0) { break; } bytes++; } return (number / 2) * multiplier; }
This took almost five hours to decipher with a LOT of help from various sources around the internet. I can't find it anymore but I thought I read somewhere that the game length was supposed to be in the header, but this could be incorrect. I would think the game length would be with the game recording date, players, colors, etc.
Next step is to work on extracting the different files from the ACTUAL MPQ (MPQ\x1A) then parse through the details there.
12/28/2011 @ 18:31
Decided to start on this project. I've added the ViewModelBase and made some changes to App.xaml and App.xaml.cs. Committed r1.