文字列からパックされた16進数を抽出しようとしています。私のアプリケーションは、ヘッダーとそれに続く2バイトの16進数を含む文字列を送信するサーバーと通信しています。この文字列には何千もの数字が含まれています。
私がやりたいのは、2バイトの圧縮された数値をそれぞれ抽出し、それを計算に使用できる数値に変換することです。
例:string = "info:\x00\x00\x11\x11\x22\x22"
3つの数値0x0000
(10進数の0)、0x1111
(10進数の4369)、0x2222
(10進数の8738)を生成します
私には実用的な解決策がありますが(以下を参照)、サーバーが送信する数千の数値を処理しようとすると、機能が遅すぎます。私のアプローチをスピードアップするためのいくつかの推奨事項を提供してください。
//Works but is too slow!
//$string has the data from the server
$arrayIndex = 0;
for($index = [start of data]; $index < strlen($string); $index+=2){
$value = getNum($string, $index, $index+1);
$array[$arrayIndex++] = $value;
}
function getNum($string, $start, $end){
//get the substring we're interested in transforming
$builder = substr($string, $start, $end-$start+1);
//convert into hex string
$array = unpack("H*data", $builder);
$answer = $array["data"];
//return the value as a number
return hexdec($answer);
}
また、単一のunpackコマンドで数値を抽出しようとしましたが、機能していません(使用するフォーマット文字列を理解するのに問題があります)
//Not working alternate method
//discard the header (in this case 18 bytes) and put the rest of the
//number values I'm interested in into an array
$unpacked = unpack("c18char/H2*data", $value);
for($i = 0; $i < $size; $i+=1){
$data = $unpacked["data".$i];
$array[$i] = $data;
}