PHP написать двоичный ответ
В php есть способ записи двоичных данных в поток ответов,
как эквивалент (С# asp)
System.IO.BinaryWriter Binary = new System.IO.BinaryWriter(Response.OutputStream);
Binary.Write((System.Int32)1);//01000000
Binary.Write((System.Int32)1020);//FC030000
Binary.Close();
Затем мне хотелось бы прочитать ответ в приложении С#, например
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();
Ответы
Ответ 1
В PHP строки и байтовые массивы являются одними и теми же. Используйте pack
для создания байтового массива (строки), который вы затем можете записать. Как только я понял, что жизнь стала легче.
$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;
Ответ 2
Это тот же ответ, который я отправил в этот, похожий, вопрос.
Предполагая, что массив $binary
представляет собой ранее построенный массив байтов (например, монохромный растровый пиксель в моем случае), который вы хотите записать на диск в этом точном порядке, приведенный ниже код работал у меня на AMD 1055t с запущенным сервером ubuntu 10.04 LTS.
Я повторил каждый ответ, который мог найти в Сети, проверяя вывод (я использовал либо shed, либо vi, как в этом ответе), чтобы подтвердить результаты.
<?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";
?>
Ответ 3
Обычно я использую chr()
;
echo chr(255); // Returns one byte, value 0xFF
http://php.net/manual/en/function.chr.php
Ответ 4
Вероятно, вам нужна функция pack - она дает вам приличный контроль над тем, как вы хотите, чтобы ваши ценности были структурированы, т.е. 16 бит или 32 бита за раз, мало-endian против big-endian и т.д.