Тип данных предположения - PullRequest
3 голосов
/ 08 мая 2020

Сейчас я пытаюсь угадать, какой тип данных имеют следующие необработанные байты.

25B3 E548 0200 0000 0003 BF1F D44B 217 C 5440 B64E 74B6 E16B 5A40 8B54 F861 F2A9 5440 68C3 95DF C88A 5A40 1021 9EB2 16D 5440 374D 0D3 C FBAB 5A40 01C2 1815 6400 5540 D628 2EA3 4ECF 5A40

ra

Он сохраняется в переменной с именем outlinePath и имеет какое-то действие с формами. Необработанные байты были закодированы в base64 с помощью NSKeyedArchiver.

Я уже пробовал массив float32 и int16. Однако ни то, ни другое не имеет смысла.

Это код, который я придумал. Этот код отлично работает в других частях набора данных:

/**
 * Convert the base64 encoded float32 array to actually float32 values
 * @param buffer base64 encoded string
 */
export function convertBase64Floats(buffer: string) {
    // Decode base64
    const decodedBuffer = new Buffer(buffer, 'base64');
    // Float32 => 4 bytes
    // Get number of float values
    const floatValuesCount = decodedBuffer.length / 4;
    // New array with correct floats
    const arrayOfFloats: number[] = [];
    // Get float32s from buffer
    for (let i = 0; i < floatValuesCount; i++) {
        const offset = i * 4;
        const float = decodedBuffer.readFloatLE(offset);
        arrayOfFloats.push(float);
    }
    // Return new array of correct float values
    return arrayOfFloats;
}

export function convertInt32Array(buffer: Buffer, useBE: boolean = false) {
    const intValuesCount = buffer.length / 4;
    const arrayOfInts: number[] = [];
    for (let i = 0; i < intValuesCount; i++) {
        const offset = i * 4;
        const float = useBE ? buffer.readInt32BE(offset) : buffer.readInt32LE(offset);
        arrayOfInts.push(float);
    }
    return arrayOfInts;
}

/**
 * Convert the base64 encoded int32 array to actually int32 values
 * @param buffer base64 encoded string
 * @param useBE use readInt32BE instead of readInt32LE
 */
export function convertBase64Integers(buffer: string, useBE: boolean = false) {
    // Decode base64
    const decodedBuffer = new Buffer(buffer, 'base64');
    // Int32 => 4 bytes
    // Get number of integer values
    const intValuesCount = decodedBuffer.length / 4;
    // New array with correct floats
    const arrayOfInts: number[] = [];
    // Get float32s from buffer
    for (let i = 0; i < intValuesCount; i++) {
        const offset = i * 4;
        const float = useBE ? decodedBuffer.readInt32BE(offset) : decodedBuffer.readInt32LE(offset);
        arrayOfInts.push(float);
    }
    // Return new array of correct float values
    return arrayOfInts;
}

Тот же набор данных также содержит переменную strokePath, которая выглядит аналогичным образом. Также массив с координатами, который называется extremePoints.

Вот ссылка на полный набор данных, закодированный как json: https://pastebin.com/sadZAvyS

Набор данных представляет собой следующую форму:

enter image description here

Может быть, кто-нибудь с большим опытом работы с геометрическими c формами мог бы объяснить мне, как эта структура данных представляет частичную форму.

Редактировать: Я только что заметил , это также могут быть данные только для одного небольшого элемента в частичной форме.

1 Ответ

0 голосов
/ 20 мая 2020

Еще не ответ, но начало:

Глядя на шестнадцатеричный дамп - c из outlinePath и strokePath, данные выглядят структурированными (не сжатыми), что оставляет надежду на их декодирование:

0000000   %   ³   å   H 002  \0  \0  \0  \0 003   ¿ 037   Ô   K   !   |
0000010   T   @   ¶   N   t   ¶   á   k   Z   @ 213   T   ø   a   ò   ©
0000020   T   @   h   Ã 225   ß   È 212   Z   @ 020   ! 236   ² 026   Ö
0000030   T   @   7   M  \r   <   û   «   Z   @ 001   Â 030 025   d  \0
0000040   U   @   Ö   (   .   £   N   Ï   Z   @                        
000004a

и

0000000   %   ³   å   H 005  \0  \0  \0  \0 003 003 003 003   V   G   j
0000010   Ì   ¶   7   R   @   Æ   p   á 200   ©   l   Y   @   ¹   D   z
0000020   a   i   »   R   @   æ   ä   r  \t   ï 206   Y   @ 032   ¡ 204
0000030   q   \   9   S   @   Ê 236 204 034   $   ±   Y   @   u   e    
0000040 214   w   ¯   S   @   n   z   z   U   0   é   Y   @   §   v   y
0000050   º   i   «   S   @   -   4 217   Ì   Ü   ï   Y   @   B   ó   l
0000060   Ÿ   #   §   S   @   Ì       í   X   Ê   ö   Y   @   ª   E   Ñ
0000070  \b   š   ¢   S   @ 033   œ   :   O  \v   þ   Y   @ 023   ,   O
0000080 212   .   ,   S   @   ª   s   ²  \f 020   Æ   Y   @   Î   ·   1
0000090   G   ¹   ­   R   @   §   A 224   }   5 234   Y   @   L   K   î
00000a0   Á   t   )   R   @   p   8   Ã   0   š 202   Y   @   l   e   Ý
00000b0   =   s   .   R   @ 210   &   O   Û   +   {   Y   @   @ 237   §
00000c0   º   4   3   R   @ 035   L   Š   Ä   Ô   s   Y   @   V   G   j
00000d0   Ì   ¶   7   R   @   Æ   p   á 200   ©   l   Y   @            
00000dd

Вы заметите общий 4-байтовый заголовок, за которым следует небольшое число 002 или 005, 4 нулевых байта, либо 1 или 4 умножить на 003, а затем либо 8, либо 26 последовательности из 8 байтов, заканчивающиеся буквой (T | Z | U | R | S | Y) и @.

...