0


0

これらのアドレス間の16進値を読み取るPHPの問題?

オンラインファイルアナライザーを作成していますが、小さな問題があります。 出力(これは実際のヘックスの位置です)

_ 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 _

それがあるべきとき

_ 44 72 48 79 64 72 61 6C 69 73 6B _

DrHydralisk(私)の彼のヘクス。 誰も私が後者を出力するのを手伝うことができますか、それをそのままストレートに出力することができますか?

編集

ここに私がやろうとしていることのイメージがあります。

これが私が読み込もうとしているファイル、Starcraftのリプレイ(file.SC2Replay)です。 16進エディタでDrHydraliskを検索するだけで、そこから読み込もうとしています。

2 Answer


2


(クリアテキストがファイルにある場合):

for( $i=0x481; $i<0x48D; $i++ ) {
   printf("%X ", ord($file_contents[$i]));
}

ループの境界に注意してください:0x481 .. 0x48D

結果:

44 72 20 48 79 64 72 61 6C 69 73 6B

ファイルに16進数が含まれている場合、ASCII文字の値の範囲には16進数の文字ごとに2バイトが必要なので、これは不可能です。 それでは、ファイルには実際に何がありますか?

'' '' '

編集

あなたのファイルを読んだ後、私はやった:

...

$file = 'file.SC2Replay';
$file_contents = file_get_contents($file);

for( $i=0x438; $i<0x443; $i++) {
   printf("%X ", ord($file_contents[$i]));
}
 for( $i=0x438; $i<0x443; $i++) {
   printf("%s ", $file_contents[$i]);
}

...

そしてそれは言う:

72 48 79 64 72 61 6C 69 73 6B

and

D r H y d r a l i s k

あなたはファイルの位置を台無しにした;-)

よろしく

rbo


1


編集:

ファイルを提供してくれてありがとう、たくさん助けて! Beleive私もそれを機能させました:

//Do binary safe file read
$filename = 'file.SC2Replay';
$file = fopen($filename, "rb");
$contents = fread($file, filesize($filename));
fclose($file);

//position 1080 - 1091
for ($i = 0x438; $i < 0x443; $i++)
    echo $contents[$i];

あなたがおそらく問題を抱えていた理由は、まず第一に、PHPで読み込まれたバイナリセーフファイルが自動的に正しいASCII文字でバイトを置き換えるため、実際に読み取りを開始するために必要な位置を捨てたからです。 1153年に始まり、1080から始まります。

'' '' '

読み込んだファイルの使用方法を説明していただけますか? 以下の16進数に相当するため:

11531154115511561157115811591160116111621163

is:

481 482 483 484 485 486 487 488 489 48a 48b

また、役立つと思われる2つのphp関数があります。

chr(int):指定された整数に関連付けられたASCII文字を返します-http://php.net/manual/en/function.chr.php

dechex(int):指定された整数の16進値を返します-http://php.net/manual/en/function.dechex.php