反转用于存储 UTF-8 字符串的二进制结构
Reversing binary structure that is used to store UTF-8 string
我是reverse-engineering自定义二进制文件格式。我找到了表示 UTF-8 字符串的数据结构。 header中有一两个字节用来保存字符串长度,然后是实际的字符串数据。
╔════════════╦═══════════════╦═══════════════════╗
║ first byte ║ optional byte ║ UTF-8 string data ║
╚════════════╩═══════════════╩═══════════════════╝
header中的第二个字节是可选的,只有当字符串长度大于 128 字节时才会出现。当字符串长度小于或等于 128 字节时,解码它的长度很容易。但是,当字符串长度 > 128 时,我无法计算字符串长度。所以我做了实验并生成了许多具有不同字符串长度的二进制文件,结果如下。字符串长度以字节为单位。
╔════╦════╦═══════════════╗
║ 01 ║ 02 ║ String length ║
╠════╬════╬═══════════════╣
║ 7D ║N/A ║ 126 ║
║ 7E ║N/A ║ 127 ║
║ 7F ║N/A ║ 128 ║
║ 80 ║ 01 ║ 129 ║
║ 81 ║ 01 ║ 130 ║
║ C7 ║ 01 ║ 200 ║
║ C8 ║ 01 ║ 201 ║
║ F9 ║ 01 ║ 250 ║
║ FE ║ 01 ║ 255 ║
║ FF ║ 01 ║ 256 ║
║ 80 ║ 02 ║ 257 ║
║ 81 ║ 02 ║ 258 ║
║ 82 ║ 02 ║ 259 ║
║ F3 ║ 03 ║ 500 ║
║ F4 ║ 03 ║ 501 ║
║ F5 ║ 03 ║ 502 ║
║ F6 ║ 03 ║ 503 ║
║ 80 ║ 04 ║ 513 ║
╚════╩════╩═══════════════╝
我在某处读到 pascal\delphi 正在使用字符串格式,它使用 header 来保存字符串长度,而不是像 C 中那样以空字符结尾的字符串,这看起来与我的情况相似。我的问题是,你知道这种格式吗?当字符串长度大于128字节时,如何计算字符串长度。
您可以计算为 (FirstByte and 0x7F) + 0x80 * SecondByte + 1
我是reverse-engineering自定义二进制文件格式。我找到了表示 UTF-8 字符串的数据结构。 header中有一两个字节用来保存字符串长度,然后是实际的字符串数据。
╔════════════╦═══════════════╦═══════════════════╗
║ first byte ║ optional byte ║ UTF-8 string data ║
╚════════════╩═══════════════╩═══════════════════╝
header中的第二个字节是可选的,只有当字符串长度大于 128 字节时才会出现。当字符串长度小于或等于 128 字节时,解码它的长度很容易。但是,当字符串长度 > 128 时,我无法计算字符串长度。所以我做了实验并生成了许多具有不同字符串长度的二进制文件,结果如下。字符串长度以字节为单位。
╔════╦════╦═══════════════╗
║ 01 ║ 02 ║ String length ║
╠════╬════╬═══════════════╣
║ 7D ║N/A ║ 126 ║
║ 7E ║N/A ║ 127 ║
║ 7F ║N/A ║ 128 ║
║ 80 ║ 01 ║ 129 ║
║ 81 ║ 01 ║ 130 ║
║ C7 ║ 01 ║ 200 ║
║ C8 ║ 01 ║ 201 ║
║ F9 ║ 01 ║ 250 ║
║ FE ║ 01 ║ 255 ║
║ FF ║ 01 ║ 256 ║
║ 80 ║ 02 ║ 257 ║
║ 81 ║ 02 ║ 258 ║
║ 82 ║ 02 ║ 259 ║
║ F3 ║ 03 ║ 500 ║
║ F4 ║ 03 ║ 501 ║
║ F5 ║ 03 ║ 502 ║
║ F6 ║ 03 ║ 503 ║
║ 80 ║ 04 ║ 513 ║
╚════╩════╩═══════════════╝
我在某处读到 pascal\delphi 正在使用字符串格式,它使用 header 来保存字符串长度,而不是像 C 中那样以空字符结尾的字符串,这看起来与我的情况相似。我的问题是,你知道这种格式吗?当字符串长度大于128字节时,如何计算字符串长度。
您可以计算为 (FirstByte and 0x7F) + 0x80 * SecondByte + 1