4

これは、使用される「C++」構造です。

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 US 12.23 34.12 90.12料金12 56.12 01/01/1998 A US 52.23 54.12 10.12料金92 16.12 31/12/12/12/12/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 90.12 手数料 12 56.12

上記バイナリファイルの内容を読み取るためのPHPコーディング。

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);
?>

これは、上記のコードから取得したものです。私が得ているのは、2 番目と 7 番目のフィールドに大量のガベージ値です。また、精度は float フィールドを超えています。これを修正する方法は?

1995 年 12 月 12 日 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

1998 年 1 月 1 日 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

1999 年 12 月 31 日 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/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«¹¿·ÅÿÿýŽäSg·¸xw ·ÆD¬¹¿L¬¹¿5rP·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

4

2 に答える 2

0

PHP のpackおよびunpackでは、フォーマット コードaは NULパディング文字列を表します。この場合、2 番目と 7 番目のフィールドは NUL パディングされていないように見えます。文字列の終了位置を示す NUL があり、その後にランダム データが続きます。

substrNUL の前の文字列の一部を取得するには、 andを使用できますstrpos

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

float フィールドには正しい値があり、C プログラムからの出力に表示される値は丸められます。sprintfPHP で同じことを行うには、たとえば次のように使用できます。

$input = 16.120000839233;
$output = sprintf("%.2f", $input);
var_dump($output); // string(5) "16.12"
于 2012-06-08T08:10:01.443 に答える
0

はい、unpack の 2 番目の引数は「a128ac」であり、マニュアル (http://jp2.php.net/manual/en/function.pack.php) では「a」は「NUL で埋められた文字列」を表すと言われていますが、必要な場合もあります。 「スペースで埋められた文字列」である「A」。ターミネータが適切に見つからないため、表示されるのはゴミです。

于 2012-06-08T08:10:32.333 に答える