2016-06-12 10 views
1

私はファイルからバイトを読み込み、それらを処理。その後、パックされたバイトを保存したいと思います。使用PHP、プロセスとパックアレー

バイト文字列に混在するオブジェクト/タイプを配列に変換するために推奨さ+汎用的な方法は何ですか?私の場合、int型とstring型の配列、pack型a、C、x。

簡単な例:

// $bytes = fread($handle, 100); 
$bytes = "437XYZ25.011001DBEFORE       ...."; 

$unpackString = "a3CPN/x8spare/CDSC/x4spare/a32OPT"; 
$unpacked = unpack($unpackString, $bytes); 

var_dump($unpacked); 
/* 
array(3) { 
    ["CPN"]=> string(3) "437" 
    ["DSC"]=> int(49) 
    ["OPT"]=> string(32) "BEFORE       " 
} 
*/ 

// example of processing 
$unpacked["DSC"] = 12; 
$unpacked["OPT"] = "AFTER       "; 

// pack + write the result 
// $packString = "a3x8Cx4a32"; 
$packTypes = ["a3","x8","C","x4","a32"]; 
$packFields = [ $unpacked["CPN"], null, $unpacked["DSC"], null, $unpacked["OPT"] ]; 
// ... 

更新:私はどこで、どのようなタイプに属するどのようなコンテンツ明確であることを確認する$packTypes$packFields$packStringを交換した簡単な例では。

+0

質問は何ですか?あなたは、配列を展開する 'unpack'を使用し、なぜあなたは再びそれをパックする' pack'を使用することはできませんか?問題は 'pack'が単一の配列の代わりに引数を受け入れるという事実ですか? –

+0

確かに。配列を使ってパックする方法。 – wivku

答えて

1

私は、あなたが探していることは、あなたがあなたの例を持っているとして、連想配列で引数を受け付けpackを呼び出す方法、であると仮定します。このために、我々はその名前で関数を呼び出し、指定された配列から引数を提供call_user_func_arrayを使用することができます。

$bytes = "437XYZ25.011001DBEFORE       ...."; 
$unpackString = "a3CPN/x8spare/CDSC/x4spare/a32OPT"; 
$unpacked = unpack($unpackString, $bytes); 

// example of processing 
$unpacked["DSC"] = 12; 
$unpacked["OPT"] = "AFTER       "; 

// pack + write the result 
$packTypes = ["a3", "x8", "C", "x4", "a32"]; 
$packFields = [$unpacked["CPN"], null, $unpacked["DSC"], null, $unpacked["OPT"]]; 

$packString = ""; 
$packArguments = []; 
for ($i = 0; $i < count($packTypes); $i++){ 
    $packString .= $packTypes[$i]; 
    if ($packFields[$i] !== null){ 
     // the null bytes don't use an argument 
     $packArguments[] = $packFields[$i]; 
    } 
} 

// put packString as the first argument 
array_unshift($packArguments, $packString); 

$output = call_user_func_array("pack", $packArguments); 

そして$outputは次のようになります。

00000000 34 33 37 00 00 00 00 00 00 00 00 0c 00 00 00 00 |437.............| 
00000010 41 46 54 45 52 20 20 20 20 20 20 20 20 20 20 20 |AFTER   | 
00000020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |    | 
00000030 
+1

素晴らしい。私は前にcall_user_func_arrayのアプローチを見たが、コンテキストがありませんでした。ありがとう! – wivku

関連する問題