2012-06-08 2 views
4

Это используемая структура «C++».Чтение двоичного файла с помощью PHP

struct gross 
    { 
     char date[11]; 
     char ac[128]; 
     char type[5]; 
     float mvalue; 
     float netraw; 
     float netfer; 
     char stat[128]; 
     float firr; 
     float acb; 
    }; 

Это содержимое двоичного файла, сгенерированного при компиляции с помощью компилятора GCC.

12/12/1995 d нам 12,23 34,12 90,12 12 56,12 сборов 01/01/1998 США 52.23 54.12 10.12 16.12 сборов 92 31/12/1999 США 52.23 54.12 10.12 16.12 сборов 92 31/12/1999 d us 12,23 34,12 90,12 сборов 12 56,12 01/01/2000 a us 52,23 54,12 10,12 сборов 92 16,12 01/01/2000 z us 12,23 34,12 90,12 сборов 12 56,12 31/12/2010 a us 52,23 54,12 10,12 плата 92 16,12 31/12/2010 d нам 12,23 34,12 90,12 12 56,12 сборы

РНР кодирования читать продолжение в этом двоичном файле.

echo "<table>"; 
while (!feof($f)) { 

    if ($s = fread($f, 292)) { 

     $nn = unpack('a11date/a128ac/a5type/fmvalue/fnetraw/fnetfer/a128stat/ffirr/facb', $s); 

     echo "<td>" . $nn[date] ."</td>"; 
     echo "<td>" . $nn[ac] . "</td>"; 
     echo "<td>" . $nn[type] . "</td>"; 
     echo "<td>" . $nn[mvalue] . "</td>"; 
     echo "<td>" . $nn[netraw] . "</td>"; 
     echo "<td>" . $nn[netfer] . "</td>"; 
     echo "<td>" . $nn[stat] . "</td>"; 
     echo "<td>" . $nn[firr] . "</td>"; 
     echo "<td>" . $nn[acb] . "</td>"; 
     echo "</tr>"; 
} 
} 
     echo "</table>"; 
fclose($f); 
?> 

Это то, что я получил от вышеуказанного кода. То, что я получаю, - это много значений мусора во втором и седьмом поле. И точность превышает поля поплавка. Как это исправить?

12/12/1995 d¸³M · г · · EW ¤dw · AEW · · Наши YYYY, ш · ш; ш · ̪¹¿ô {· {· Å # Ä 5rP · 0 # o · ¸xw · x « ¹À · ÅÿÿýŽäSg · ¸xw · ÆD¬¹ÀL¹¹55P · pòy · 12 56.119998931885

01/01/1998 a¸³M · g · ew · ¤dw · àew · Öúr · ÿÿÿÿ, w · ø; w · ̪¹¿ô · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · äSg · rP · ô> Å # Ä 5rP · 0 # o · ¸xw · x «¹ · · ÿÿÿÿŽäSg · ¸xw · ÆD¬¹ÀL¬¹À5rP · pòy · 92 16.120000839233

31/12/1999 a¸³M · g · ew · ¤dw · àew · Öúr · ÿÿÿÿ, w · ø; w · ̪¹¿ô {· {· <ïy · Ð · · · · · · · · · · · · · · · ¤dw · ew · € 5w · ôOg · X «¹¿» qP · äSg us 52.229999542236 54.119998931885 10.119999885559 гонорары · 5rP · # ÄSg · rP · ô> Å # Ä 5rP · 0 # o · ¸xw · x « ¹À · ÅÿÿýŽäSg · ¸xw · ÆD¬¹ÀL¬¹À5rP · pòy · 92 16.120000839233

31/12/1999 d¸³M · g · ew · ¤dw · àew · Öúr · ÿÿÿÿ, w · ø; w · ̪¹¿ô {· {· <ây · Ð {· SpP · ip · ¤dw · ew · € 5w · ôOg · X «¹¿» qP · äSg us 12.229999542236 34.119998931885 90.120002746582 сборы · 5rP · # Ä äSg · rP · ô> Å # Ä 5rP · 0 # o · ¸xw · x «¹ · · ÿÿÿÿŽäSg · ¸xw · ÆD¬¹ÀL¬¹À5rP · pòy · 12 56.119998931885

01/01/2000 a¸³M · g · ew · ¤dw · àew · Öúr · ÿÿÿÿ, w · ø; w · ̪¹¿ô {· {· <ây · Ð {· SpP · ip · ¤ dw · ew · € 5w · ôOg · X «¹¿» qP · äSg us 52.229999542236 54.119998931885 10.119999885559 сборы · 5rP · # ÄSg · rP · ô> Å # Ä 5rP · 0 # o · ¸xw · x «¹¿ · ÅÿÿýŽäSg · ¸xw · ÆD¬¹ÀL¬¹À5rP · pòy · 92 16.120000839233

01/01/2000 z¸³M · g · ew · ¤dw · àew · Öúr · ÿÿÿÿ, w · ø; w · ̪¹¿ô {· {· <ây · Ð {· SpP · ip · ¤dw · ew · € 5w · ôOg · X «¹¿» qP · äSg us 12.229999542236 34.119998931885 90.120002746582 сборы · 5rP · # Ä äSg · rP · ô> Å # Ä 5rP · 0 # o · ¸ xw · x «¹ · · ÿÿ Ž Ž S S · ¸xw · ÆD¬¹ÀL¹¹55P · pòy · 12 56.119998931885

31/12/2010 a¸³M · g · ew · ¤dw · àew · Öúr · ÿÿÿÿ, w · ø; w · ̪¹¿ô {· {· <ây · Ð {· SpP · ip · ¤dw · Ew · € 5w · ôOg · X «¹¿» qP · äSg us 52.229999542236 54.119998931885 10.119999885559 сборы · 5rP · # ÄSg · rP · ô> Å # Ä 5rP · 0 # o · ¸xw · x «¹¿ · · ÅÿÿýŽäSg · ¸xw · ÆD¬¹ÀL¬¹À5rP · pòy · 92 16.120000839233

31/12/2010 d¸³M · g · ew · ¤dw · àew · Öúr · ÿÿÿÿ, w · ø; w · ̪¹¿ô {· {· <ây · Ð {· SpP · ip · ¤dw · ew · € 5w · ôOg · X «¹¿» qP · äSg us 12.229999542236 34.119998931885 90.120002746582 сборы · 5rP · # ÄSg · rP · ô> Å # Ä 5rP · 0 # o · ¸xw · x «¹¿ · ÅÿÿýŽäSg · ¸xw · ÆD¬¹¿L¬¹À5rP · pòy · 12 56.119998931885

+1

Вероятно, это разница в кодировке символов между тем, как ваш компилятор выводит этот файл и как откроет этот файл php-скрипт. Попытайтесь выяснить, какой тип кодирования есть, и если вы можете открыть этот файл в php, указав, как его читать. –

ответ

0

В pack и unpack, коде форматирования a стендов РНР для NUL проложенного строки. В этом случае похоже, что второе и седьмое поле не заполнены NUL; они просто имеют NUL, чтобы указать, где заканчивается строка, за которой следуют случайные данные.

Чтобы получить часть строки перед тем NUL вы можете использовать substr и strpos:

$input = "a\000b"; // string with embedded NUL 
$output = substr($input, 0, strpos($input, "\000")); 
var_dump($output); // string(1) "a" 

Поплавок поля имеют правильные значения, значения, которые вы видите на выходе из программы C являются округлый. Для того, чтобы сделать то же самое в PHP можно использовать sprintf, например:

$input = 16.120000839233; 
$output = sprintf("%.2f", $input); 
var_dump($output); // string(5) "16.12" 
0

Да потому, что ваш второй аргумент распаковывать является «a128ac» и ручной (http://jp2.php.net/manual/en/function. pack.php) говорит, что «a» означает «NUL-padded string», но вы, возможно, хотите «A», который является «SPACE-padded string». То, что вы видите, это мусор, потому что терминатор не найден должным образом.

Смежные вопросы