В php существует способ записи двоичных данных в поток ответов,
как эквивалент (c # 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();
Затем я хотел бы прочитать ответ в приложении ac #, например
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();
В 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;
Это тот же ответ, который я отправил на этот вопрос, подобный вопрос .
Предполагая, что массив $binary
является ранее построенным байтом массива (например, монохромным растровым пикселем в моем случае), который вы хотите записать на диск в этом точном порядке, приведенный ниже код работал на меня на 1055t AMD, работающем на сервере 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"; ?>
Обычно я использую chr()
;
echo chr(255); // Returns one byte, value 0xFF
Вам, вероятно, нужна функция пакета – она дает вам приличный объем контроля над тем, как вы хотите, чтобы ваши значения структурировались, например, 16 бит или 32 бита за раз, мало-по-конечному и big-endian и т. Д.