2012-06-13 13 views
15

php istnieje sposób zapisu danych binarnych do strumienia reakcji,
jak równoważnik (C# Asp)
PHP napisać odpowiedź binarnego

System.IO.BinaryWriter Binary = new System.IO.BinaryWriter(Response.OutputStream); 
Binary.Write((System.Int32)1);//01000000 
Binary.Write((System.Int32)1020);//FC030000 
Binary.Close(); 



I będzie wówczas jak aby odczytać odpowiedź w aplikacji AC#, np.

System.Net.HttpWebRequest Request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create("URI"); 
System.IO.BinaryReader Binary = new System.IO.BinaryReader(Request.GetResponse().GetResponseStream()); 
System.Int32 i = Binary.ReadInt32();//1 
i = Binary.ReadInt32();//1020 
Binary.Close(); 

Odpowiedz

11

W PHP, łańcuchy i tablice bajtowe są jednym i tym samym. Użyj pack, aby utworzyć tablicę bajtów (łańcuch), którą możesz następnie zapisać. Kiedy zdałem sobie z tego sprawę, życie stało się łatwiejsze.

$my_byte_array = pack("LL", 0x01000000, 0xFC030000); 
$fp = fopen("somefile.txt", "w"); 
fwrite($fp, $my_byte_array); 

// or just echo to stdout 
echo $my_byte_array; 
+0

+1 za odpowiedź, która mi pomogła. Dodaję, że to, co dla mnie działało, to kolejna odpowiedź. –

0

Prawdopodobnie chcesz funkcję pack - to daje przyzwoitą ilość kontroli nad tym, jak chcesz, aby wartości, jak również strukturę, czyli 16 bitów lub 32 bitów na raz, trochę -endian versus big-endian, itp.

1

To jest ta sama odpowiedź, którą wysłałem do this, similar, question.

Zakładając, że tablicę $binary jest wcześniej zbudowanych bajtów array (jak monochromatyczny bitmapy pikseli w moim przypadku), które mają być zapisane na dysku w dokładnie takiej kolejności, poniższy kod pracował dla mnie na 1055t AMD działa serwer Ubuntu 10.04 LTS .

Przejrzałem każdy rodzaj odpowiedzi, jaki mogłem znaleźć w sieci, sprawdzając wynik (użyłem shed lub vi, like in this answer), aby potwierdzić wyniki.

<?php 
$fp = fopen($base.".bin", "w"); 
$binout=Array(); 
for($idx=0; $idx < $stop; $idx=$idx+2){ 
    if(array_key_exists($idx,$binary)) 
     fwrite($fp,pack("n", $binary[$idx]<<8 | $binary[$idx+1])); 
    else { 
     echo "index $idx not found in array \$binary[], wtf?\n"; 
    } 
} 
fclose($fp); 
echo "Filename $base.bin had ".filesize($base.".bin")." bytes written\n"; 
?>