Хотя это не PHP, VFP - это ссылки на основе 1, и я думаю, что PHP - ссылки на основе нуля, поэтому вам придется расшифровывать и корректировать их соответствующим образом, но это работает и, надеюсь, вы сможете
опубликовать свою версию этой части, когда закончите.
FILETOSTR () в VFP откроет файл и прочитает весь контент в
единственная переменная памяти в виде символьной строки - все управляющие ключи, старшие байтовые символы и т. д. не повреждены. Вам, вероятно, нужно полагаться на FOPEN (), FSEEK (), FCLOSE () и т. Д.
MemoTest.FPT был моим примером таблицы / файла заметок
fpt1 = FILETOSTR ("MEMOTEST.FPT")
Во-первых, вам необходимо определить размер МЕМОБЛОКА, использованный при создании файла. Обычно это 64 байта, но по ссылке, которую вы указали в своем сообщении.
Позиции заголовков 6-7 определяют размер (VFP, позиции 7 и 8). Первый байт старшего разряда
nBlockSize = ASC( SUBSTR( fpt1, 7, 1 )) * 256 + ASC( SUBSTR( fpt1, 8, 1 ))
Теперь по вашим индивидуальным записям. Везде, где в вашей структуре DBF есть памятка FIELD (и у вас может быть много на одну структуру записи), будет 4 байта. В поле RECORD указывается «блок» в файле заметки, в котором хранится содержимое.
MemoBytes = 4 байта в указанном вами месте поля. Они будут сохранены как ASCII от 0 до 255. Это поле сохраняется с младшим байтом FIRST, а 4-й байт - 256 ^ 3 = 16777216. Первый из когда-либо использованных «блоков» будет начинаться со смещением позиции 512 в соответствии со спецификацией файла memo .fpt, которую занимает заголовок позиции 0-511.
Итак, если ваше первое мемо-поле имеет содержимое «8000», где 8 - это фактическое значение 0x08, а не число «8», равное 0x38, а нули - 0x00.
YourMemoField = "8000" (на самом деле используйте ascii, но для удобства чтения показывает ожидаемое шестнадцатеричное значение)
First Byte is ASCII value * 1 ( 256 ^ 0 )
Second Byte is ASCII value * 256 (256 ^ 1)
Third Byte is ASCII value * 65536 (256 ^ 2)
Fourth Byte is ASCII value * 16777216 (256 ^ 3)
nMemoBlock = byte1 + ( byte2 * 256 ) + ( byte3 * 65536 ) + ( byte4 * 16777216 )
Теперь вам нужно выполнить FSEEK () до
FSEEK( handle, nMemoBlock * nBlockSize +1 )
для первого байта блока, который вы ищете. Это будет указывать на заголовок BLOCK. В этом случае, согласно спецификации, первые 4 байта идентифицируют блок SIGNATURE, вторые 4 байта - это длина содержимого. Для этих двух байты сначала сохраняются с HIGH-BYTE.
Из вашего FSEEK (), его ОБРАТНЫЙ nMemoBlock выше с старшим байтом. "Byte1-4" здесь из вашей позиции FSEEK ()
nSignature = ( byte1 * 16777216 ) + ( byte2 * 65536 ) + ( byte3 * 256 ) + byte4
nMemoLength = ( byte5 * 16777216 ) + ( byte6 * 65536 ) + ( byte7 * 256 ) + byte8
Теперь, FSEEK () до 9-го байта (1-й действительный символ данных ПОСЛЕ 8 байтов заголовка, который вы только что прочитали для подписи и длины заметки). Это начало ваших данных.
Теперь прочитайте остальную часть контента ...
FSEEK() +9 characters to new position
cFinalMemoData = FREAD( handle, nMemoLength )
Я знаю, что это не идеальный сценарий или сценарий PHP, но достаточно псевдокода о том, как все хранится, и мы надеемся, что вы ХОРОШО на своем пути.
Опять же, ПОЖАЛУЙСТА, примите во внимание, что вы проходите через процесс отладки, чтобы обеспечить 0 или 1 смещение. Чтобы упростить и проверить это, я создал простой .DBF с 2 полями ... символьным полем и памятным полем, добавил несколько записей и некоторый базовый контент для подтверждения всего контента, позиций и т. Д.