I just stumbled across this thread and started to edit my replay files in a hexadecimal editor.
The beginning of the file is easy (and since I don't have my PS2 to do extra tests I can only do easy things right now) and I now know more or less where are useful information between addresses 0x00000000 and 0x000000AA.
Ok, that's only the first 171 bytes, but from the look of the file, I expect all information we need to be stored in the first kilobyte. (Knowing nothing of how GT3 replays were stored, I might be completely wrong, of course, that wouldn't be the first time).
I'll post any further info in this thread, and if you think you already have all information on what I'm busy looking for, just tell me
Edit 1: I just did addresses 0x000000AB to 0x00000254 now (almost 600 bytes). I wish I could know what's in the replay I'm reading and not do this blindly. I'm now afraid that these 255 first bytes only concern the Sharkport software and that the actual replay might only start at address 0x00000255.
I'll download a replay on GTP for which I'll know the final time. Perhaps that'll help to find it.
Edit 2: I compared 3 saves posted in WRS week 3 results, and that confirm some of what I suggest below but not all.
Adresses 0x00000070 to 0x00000073 in all 3 files were exactly the same, so they could represent the car and track (I would need replays at Autumn Ring without another car to make sure).
Here is what I have so far :
00000000 - 00000014 = file signature + "SharkPortSave"
00000015 - 00000018 = hex length of file title (L1) + filler
00000019 - 00000034 = file title on L1 bytes (L1=28 in this example)
00000035 - 00000038 = hex length of file description (L2) + filler
00000039 - 00000058 = file description on L2 bytes (L2 = 32 in this example)
00000059 - 0000005C = hex length of file notes (L3) + filler
- = file notes on L3 bytes (L3 = zero in this example)
0000005D - 0000005E = not identified but specific to replay
0000005F - 0000006E = GT4 game ID "BESCES-51719"
0000006F = 42 for ghost saves ; 52 for race saves
00000070 - 00000073 = not identified but specific to replay ------> this could be the car and track IDs
00000074 = fixed hex value "59"
00000075 = not identified but specific to replay
00000076 = fixed hex value "59"
00000077 - 000000A2 = always empty "00 00 ..."
000000A3 - 000000A6 = fixed value "06 00 00 00"
000000A7 - 000000AA = not identified but specific to replay +filler "00 00"
000000AB - 000000AC = not identified but specific to replay
000000AD = empty "00"
000000AE = 00 or 80, specific to replay
000000AF - 000000B3 = fixed value "84 27 00 00 00"
000000B4 - 000000B7 = not identified but specific to replay
000000B8 - 000000BB = (almost) fixed value "03" or "04" and "D5 07 00"
000000BC = not identified, could be linked to 000000B4 and 000000AE
000000BD - 000000BF = identical to 000000B5 - 000000B7
000000C0 - 000000C3 = identical to 000000B8 - 000000BB
000000C4 - 000000CB = fixed value "00 00 00 04 00 00 00 00"
000000CC - 000000CF = identical to 000000B4 - 000000B7
000000D0 - 000000D2 = identical to 000000C0 - 000000C2
000000D3 - 00000112 = name of the replay ? (not affected by SharkPort name changed by user)
00000113 - 00000147 = fixed value depending on 'ghost save' or 'race save'
00000148 = not identified but specific to replay
00000149 - 000001A0 = fixed value "thumbnail" + garbage
000001A1 - 000001A2 = not identified but specific to replay
000001A3 - 000001A4 = filler
000001A5 - 000001A6 = not identified but specific to replay
000001A7 - 000001AD = fixed value "00 00 84 97 00 00 00"
000001AE = not identified but specific to replay
000001AF - 000001B1 = identical to 000000B5 - 000000B7
000001B2 - 000001B5 = identical to 000000B8 - 000000BB
000001B6 - 000001B9 = identical to 000001AE - 000001B1
000001BA - 000001BD = identical to 000000B8 - 000000BB
000001BE - 000001C5 = fixed value "00 00 00 01 00 00 00 00"
000001C6 - 000001C9 = identical to 000001AE - 000001B1
000001CA - 000001CC = identical to 000000C0 - 000000C2
000001CD - 00000254 = fixed value + filler