V tom PSPadu zobrazuješ ten výstupní soubor? Tak to bych ho přece jen zkusil zavřít.
... chová se to tak, že když zapisuji např. dvě čísla v hex je to 78 a 64 tak hex editor to zobrazuje jako 7800 6400 .
Hex editor a ne viewer? Nemůže do toho zapisovat třeba ten? Jinak 7800 6400 je v pořádku. Seekuješ o bajt při zápisu dalšího čísla:
fseek($fh, $i);
fwrite($fh, chr($arr[1]), 1);
$result = fseek($fh, $i + 2);
Jen takové hodnoty asi mohou skutečně zmást nějaký editor, který reaguje na změny v souboru. Už jen proto, že v metodě reset() ten deskriptor po vyplnění souboru nulama explicitně zavíráš. Jestli např. nějaký editor (pspad, hex editor) se nechává notifkovat o změnách souboru, který má otevřen, tak to může v ten okamžik přepsat, protože to na první pohled připomíná little endian UCS-2 nebo UTF16 a ten BOM by tomu odpovídal. Taky to samozřejmě mohou být regulární hodnoty z toho skriptu, ale ten příklad co jsi uváděl tomu neodpovídá. Navíc by to nevysvětlovalo to ořezání co jsi pozoroval.
Já to vidím takhle:
Mám prázdný řetězec, do kterého přidávám \x00, potom ho uložím pomocí fwrite do prázdného souboru vytvořeného pomocí fopen v binárním režimu. Jak by se tam mohl dostat BOM? Do toho řetězce? Nebo na začátek souboru při vytváření pomocí fopen(..., 'xb')? I kdyby měl ten skript na začátku BOM nebo byl v jakémkoliv kódování?
Já tam vidím čtyři možnosti: Buď ten soubor již existoval s BOM na začátku před voláním skriptu nebo ho něco externího upravilo mimo skript - třeba ten zmiňovaný PSPad nebo použitý hex editor (neznám ani jeden) nebo něco jiného. Nebo je něco shnilého v implementaci php pro windows (to jsi mohl zmínit v prvním postu

nebo nevím jak funguje zápis binárních souborů na windows - to skutečně nevím, nedivil bych se ničemu. A nebo jsem v tom kódu přehlédl řádek:
if (!rand()) fwrite($fh, \xEF\xBB);
Mě spíš překvapuje že tam netestuješ úspěšnost fwrite, fseek, fclose.... pokud se ten soubor ořezal před prvním \x00 za BOM tak přece selhal následný fseek.
Pokud ten problém souvisí s PHP na windows, tak k tomu poradit neumím.
wb by bylo pro zápis, kdežto já potřebuji číst i psát.
Myslel jsem použít mód "wb" v metode reset() místo módu "xb", kde ten soubor stejně jen vyplníš \x00 a zavřeš. To "xb" předělává metodu reset, takže dělá něco jiného než je její název - existenci souboru kontroluješ před jejím voláním, alespoň v aktivní části toho kódu co jsi poslal. Ale to je jen nepodstatný detail.
$t .= chr(0)
To jsem napsal já, myslel jsem to jako náhradu za ten sprintf(), který bude možná zbytečně zdržovat. Opět jen bezvýznamný detail. Optimální by bylo
str_repeat(chr(0), $this->bufferSize)
, ale to prý nefunguje, pokud je string \x00, tak jsem to nepsal.