EDIT2:
Das Problem liegt nicht an Win/Linux, sondern an PHP 5.5.15 <> PHP 5.6.2.
pack() liefert auf PHP 5.6.2 entweder Multibytes,
oder mb_ functions sind auf PHP 5.6.2 buggy.
Fakt:
PHP 5.5.15 -- mb_strlen( pack("I", 194) ) === 4
PHP 5.6.2 -- mb_strlen( pack("I", 194) ) === 3
Was genau jetzt hier falsch läuft weiß ich noch nicht.
EDIT:
Kürzer:
warum bekomme ich auf "nicht Windows" 3 byte wenn $sequence >= 194 ?
bsp:
for(
$sequence = 0;
$sequence < 200;
$sequence = ($sequence + 1) & 0x3fffffff
){
$header = $sequence & 0x3fffffff;
$header += 0x80000000;
$header += 0x40000000;
$pack = pack("I", $header);
$len = mb_strlen($pack);
echo '$len = ' . $len . ' ($sequence #' . $sequence . ')' . PHP_EOL;
if($len < 4){
die('mb_strlen($pack) < 4');
}
}
/* out:
...
...
$len = 4 ($sequence #190)
$len = 4 ($sequence #191)
$len = 4 ($sequence #192)
$len = 4 ($sequence #193)
$len = 3 ($sequence #194)
mb_strlen($pack) < 4
*/
Alles anzeigen
EDIT END
Moin,
weiß jemand was ich hier nicht sehe oder weiß?
Die Funktion encodeHeader() sollte eigtl immer 4 byte zurückgeben - macht sie auch auf Windows (xampp).
Aufm Linux Server nicht. Da bekomme ich IMMER ab $sequence 194 nur 3 byte (nutze mb_strlen()) -
obwohl (und das versteh ich überhabt nicht) vardump() einen string von 4 ausgibt.
output Bsp:
Zitat
$sequence: 194
$packed_header: mb_strlen: 3
var_dump($packed_header): string(4) "�@"
Wie gesagt - Auf win xampp bekomm ich immer 4 byte. Warum aber nicht bei Linux?
Evtl kann mir auch jemand gleich erklären was ($sequence + 1) & 0x3fffffff bewirkt =)
function sequenceNext($sequence)
{
$next_sequence = ($sequence + 1) & 0x3fffffff;
return $next_sequence;
}
function encodeHeader($isFromServer, $isResponse, $sequence)
{
$header = $sequence & 0x3fffffff;
if($isFromServer){
$header += 0x80000000;
}
if($isResponse){
$header += 0x40000000;
}
$packed_header = pack('I', $header);
echo '$sequence: ' . $sequence . PHP_EOL;
echo '$packed_header: mb_strlen: ' . mb_strlen($packed_header) . PHP_EOL;
echo 'var_dump($packed_header): '; var_dump($packed_header); echo PHP_EOL;
if(mb_strlen($packed_header) < 4){
die;
}
#return $packed_header;
}
for(
$sequence = 0;
$sequence < 200;
$sequence = sequenceNext($sequence), encodeHeader(false, true, $sequence)
);
Alles anzeigen