|
imported>Dinoguy1000 |
| (47 intermediate revisions by 4 users not shown) |
| Line 1: |
Line 1: |
| {{Format_Navigation}} | | {{GRAFPageHeader}} |
|
| |
|
| [[GRAFs|Back to index]]
| | == {{{file_extension}}} == |
| | {{GRAFPageMisc{{ {{{|subst:}}}#if: {{{format_type|}}} | {{{{{|subst:}}}!}}{{{format_type}}} }}{{ {{{|subst:}}}#if: {{{endian_order|}}} | {{{{{|subst:}}}!}}{{{endian_order}}} }}}} |
|
| |
|
| == {{{file_extension}}} ==
| | === Format Specifications === |
| | | {{GRAFPageFormat|1=<nowiki/> |
| ''' Format Type: ''' {{{format_type}}} <br>
| |
| ''' [http://en.wikipedia.org/wiki/Endianness Endian Order]: ''' {{{endian_order}}} <br>
| |
| ''' Date Posted: ''' {{{date_posted}}}
| |
| | |
| === Format Specifications === | |
| <tt><b> | |
| {{{format_specifications}}} | | {{{format_specifications}}} |
| </b></tt>
| | }} |
| | |
| | |
| === Notes and Comments ===
| |
| 1.
| |
| In the version 24, the file names are encrypted as XOR 0xBE.
| |
| | |
| 2.
| |
| "BXP" + (byte) in all headers: In the version 24, the (byte)=3.
| |
| | |
| 3.
| |
| // ARCHIVE INDEX
| |
| char {8} - Header ("BXP" + (byte)2 + "INDX")
| |
| uint64 {8} - Unknown '''<----- this shuld be relative offset to the first "BXP.FILE"'''
| |
| I have used folloxing piece of C++ code:
| |
| ArchiveOffset = 0x00;
| |
| IndexOffset = 0x20;
| |
| TreeOffset = 0x60;
| |
| DirOffset = 0x80;
| |
| DataOffset = DirOffset + (__int64*) &buffer[TreeOffset + 8];
| |
| FileOffset = DirOffset + (__int64*) &buffer[IndexOffset + 8];
| |
| | |
| 4.
| |
| There are some directories containing both files and sub-directories. In such case, the files are listed prior to the sub-directories.
| |
| I guess that the structure of directory // see 6.
| |
| | |
| 5. I have successfuly extracted all files from the archive. Sound (*.ogg) files play well, however some other files (scripts) seems to be encrypted. Further I am wholly confused with CRCs, HASHs and Paddings for now, so I can not build an modified archive.
| |
| | |
| 6. "uint32 {4} - Unknown (1)" is a switch: 0="file is not compressed" 1="file is compressed"; compression method is zlib (*.gz). The same switch is in the "BXP.FILE" section.
| |
| I suguest that to modify the structure of "BXP.SDIR" to:
| |
| | |
| {
| |
| char {8} - Header ("BXP" + (byte)2 + "SDIR")
| |
| uint64 {8} - Unknown Length/Offset
| |
| byte {16} - null
| |
| uint32 {4} - Number Of Sub-Directories in this directory
| |
| uint32 {4} - Number Of Files in this directory
| |
| uint64 {8} - Length Of Filename Directory Component (length of subDirName+null + fileNames+nulls)
| |
| byte {16} - null
| |
| for (each file)
| |
| {
| |
| uint64 {8} - Filename Offset (relative to the start of the filename directory)
| |
| uint64 {8} - null
| |
| byte {16} - CRC?
| |
| uint32 {4} - null
| |
| uint32 {4} - A switch indicating if the file is compressed. 0=no, 1=yes //compression method: zlib (*.gz)
| |
| uint64 {8} - null
| |
| uint64 {8} - File Length (not including the file header fields?)
| |
| uint64 {8} - File Offset (relative to the start of the file data)
| |
| }
| |
| for (each sub-directory)
| |
| {
| |
| uint32 {4} - null // Filename Offset (relative to the start of the filename directory)
| |
| uint32 {4} - Relative Offset To This Directory? (32) (relative to the start of this subDirEntry)
| |
| }
| |
| for (each entry) // entry is file or sub-directory
| |
| {
| |
| uint32 {4} - Hash?
| |
| }
| |
| for (each entry)
| |
| {
| |
| char {X} - Filename // XOR 0xBE in version 24
| |
| byte {1} - null Filename Terminator // 0xBE in version 24
| |
| }
| |
| }
| |
| | |
| | |
| 7. First 32 bytes of each file if "File Data" is a header of checksum, which is not necessary for file extraction.
| |
|
| |
| {
| |
| // FILE DATA
| |
| char {8} - Header ("BXP" + (byte)2 + "DATA")
| |
| uint64 {8} - Total Length Of File Data (length of everything in "// for each file")
| |
| uint64 {8} - Padding (88,39,255,135,206,225,196,1)
| |
| uint64 {8} - null
| |
| | |
| for (each file)
| |
| {
| |
| char {8} - Header ("BXP" + (byte)2 + "FILE")
| |
| uint64 {8} - File Length (length of "X - File Data" only) [+30]
| |
| uint64 {8} - CRC?
| |
| uint32 {4} - null
| |
| uint32 {4} - A switch indicating if the file is compressed. 0=no, 1=yes //compression method: zlib (*.gz)
| |
| byte (16) - A header or check-sum?
| |
| byte (16) - For uncompressed file the same as previous byte (16), for copressed different. Maybe check-sum of decompressed file?
| |
| byte {X} - File Data
| |
| byte {X} - null Padding to a multiple of 32 bytes
| |
| }
| |
| }
| |
|
| |
|
| *** by Gregory
| | === Notes and Comments === |
| | {{{notes}}} |
|
| |
|
| === MultiEx BMS Script === | | === MultiEx BMS Script === |
| {{{bms_script}}} | | {{{bms_script}}} |
|
| |
|
| === Supported by Programs === | | === Supported by Programs === |
| {{{programs}}} | | {{{programs}}} |
|
| |
|
| |
|
| === Documentation === | | === Documentation === |
| {{{documentation}}} | | {{{documentation}}} |
|
| |
|
| |
|
| === Games === | | === Games === |
| {{{games}}} | | {{{games}}} |
| | |
| | {{GRAFPageFooter}}<noinclude>[[Category:Templates|GRAFTemplate1]]</noinclude> |