Although not PHP, VFP is 1-based references and I think PHP is zero-based references so you'll have to decypher and adjust accordingly, but this works and hopefully you'll be able
to post your version of this portion when finished.
FILETOSTR() in VFP will open a file, and read the entire content into
a single memory variable as a character string -- all escape keys, high byte characters, etc, intact. You'll probably need to rely on an FOPEN(), FSEEK(), FCLOSE(), etc.
MemoTest.FPT was my sample memo table/file
fpt1 = FILETOSTR( "MEMOTEST.FPT" )
İlk olarak, dosyanın oluşturulduğu zaman kullanılan MEMO blok boyutunu tespit etmek gerekir. Tipik olarak bu 64 bayt olurdu, ama link başına size yazı vardı.
Başlığı pozisyonları 6-7 (VFP 7 pozisyonları ve 8) boyutunu belirlemek. İlk bayt yüksek mertebe olduğunu
nBlockSize = ASC( SUBSTR( fpt1, 7, 1 )) * 256 + ASC( SUBSTR( fpt1, 8, 1 ))
Şimdi, bireysel kayıtlarına. DBF yapısı (ve tek bir kayıt yapısı gereği pek çok olabilir) not alanına sahip olursanız olun 4 bayt olacaktır. KAYIT alanda, içeriğin depolandığı not dosyasında "blok" tanımlar.
MemoBytes = sizin tespit alan yerde 4 bayt. Bu 0-255 ASCII olarak saklanır. Bu alan, düşük-düzen ve 256 ^ 3 = 16.777.216 olarak 4 byte olarak İLK bayt ile saklanır. Şimdiye kadar kullanılan ilk "Blok" memo başına 512 offset pozisyonunda başlayacak. Fpt dosyası spec başlığı kaplıyor 0-511 konumlandırır.
İlk not alan 8 gerçek 0x08 değil 0x38 "8" sayısı ve sıfır olan "8000" bir içerik varsa Yani, 0x00 vardır.
YourMemoField = "8000" (aslında ascii kullanmak, ama okunabilirlik gösteren onaltılık beklenen değer)
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 )
Şimdi, için) (fseek gerekir
FSEEK( handle, nMemoBlock * nBlockSize +1 )
Aradığınız bloğunun ilk byte için. Bu BLOK başlığına işaret eder. Bu durumda, spec göre, ilk 4 bayt, ikinci 4 bayt içeriğin uzunluğu, blok İMZASI belirlemek. Bu iki, bayt ilk YÜKSEK-BYTE ile saklanır.
Lütfen fseek itibaren (), yüksek bayt yukarıda nMemoBlock onun TERS. "Bayt 1-4" burada fseek () pozisyonu vardır
nSignature = ( byte1 * 16777216 ) + ( byte2 * 65536 ) + ( byte3 * 256 ) + byte4
nMemoLength = ( byte5 * 16777216 ) + ( byte6 * 65536 ) + ( byte7 * 256 ) + byte8
Şimdi, fseek () 9. byte (sadece imza ve not uzunluğu için okuma başlığının 8 bayt SONRA verilerin 1. gerçek karakter) için. Bu veri başlangıcıdır.
Şimdi, içeriğin kalanını okumak ...
FSEEK() +9 characters to new position
cFinalMemoData = FREAD( handle, nMemoLength )
Ben bu mükemmel olmadığını biliyorum, ne de PHP komut dosyası, ama umarım onun işler nasıl depolandığı üzerinde pseudo-kod yeterli ve iyi yolda sizi alır.
Eğer 0 veya 1 ofset temelini sağlamak için hata ayıklama sürecinde adım gibi yine dikkate almak LÜTFEN. Basitleştirmek yardımcı olmak ve bu test etmek için, 2 alanları ... karakter alan ve bir not alanı ile basit. DBF, tüm içeriği onaylamak için birkaç kayıtları ve bazı temel içeriği, pozisyonları, vb eklendi yarattı