ホームページ バックエンド開発 PHPチュートリアル PHPで受け取ったバイナリファイルの内容を置き換える方法

PHPで受け取ったバイナリファイルの内容を置き換える方法

Jun 23, 2016 pm 02:08 PM

php は次のようにバイナリ ファイルを受け取ります:
header('Content-type: text/html; charset=utf-8');
$filename = $_GET["filename"] ;
$filesize = $_GET["filesize"];

$xmlstr = $GLOBALS[HTTP_RAW_POST_DATA];//$_POST["data"];//
if(empty($xmlstr)) $xmlstr = file_get_contents( ' php://input');

$raw = $xmlstr;//ポストされたバイナリ生データを取得します
$file = fopen("./upload/".$filename,"w");// file 書き込みの準備
fwrite($file,$raw);//書き込み
fclose($file);//閉じる
?>

受信したバイナリ ファイル内の非標準文字 (>0x7F) のバイト数はそれを 3 バイトに置き換えます。たとえば、E2 を EF 9F A2 に置き換えます
次に、Php がファイルを受信した後にそれを復元し、EF 9F A2 を E2 に置き換えたいと思います。

ありがとうございました!


ディスカッションへの返信 (解決策)

受け取ったものは XML ストリームではありませんか?

バイナリ ファイルではなくテキスト ファイルです
>0x7F はすべて utf-8 ワイド文字ではありませんか?

$raw の内容を投稿して見てみると良いでしょう

fopen("./upload/".$filename,"w b");

試してみてください

補足

utf-8 の EF 9F A2 は必要ですE2 の代わりに Unicode F7E2
と E000-F8FF はユーザー定義文字に属します (つまり、ユーザーに任された領域以外に文字セットはありません)
たとえば、一部の通信インターフェースでは境界認識に外字を使用します

ここに注意してください

送信終了、形式は次のように設定されます:

if (xmlhttp.overrideMimeType) {
xmlhttp.overrideMimeType('text/plain; charset=x-user-define') } else {
xmlhttp.setRequestHeader('Accept-Charset' , 'x-user-dependent');
}
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8") ;

ファイルの送信とファイルの受信:


送信しているものはバイナリ ストリームです

XML 規約に従って、base64 エンコーディングで送信する必要があります

そうしないと、テキストとして送信するときに問題が発生します

送信時にバイナリデータとして宣言できるため、情報を確認する必要があります

オンラインでこのメソッドを見つけました:

XMLHttpRequest.prototype.sendAsBinary = function(datastr) {

function byteValue(x) {
return x.charCodeAt(0) & 0xff;
var ords = Array.prototype.map.call( datastr, byteValue);
var ui8a = new window.send(ui8a.buffer);
xmlhttp.sendAsBinary(コンテンツ);

PC で IE ブラウザを使用するだけです。
しかし、Android ブラウザで使用する必要があるため、この機能 Uint8Array をサポートしていないため、バイナリ ストリームを使用して送信する方法がわかりません。

送信されたファイルと受信されたファイルを比較すると、まだルールがあります:
C0 より大きいファイルのプレフィックスは EF 9F です (例: E2 は EF 9F A2 に置き換えられます)
C0 より小さいファイルのプレフィックスは EF 9E です (B2 など)は EF 9E B2 に置き換えられます

このようなエンコーディングがどのようにして出てきたのかわかりません。したがって、結果が正しい限り、受信したファイルの16進値を置き換えたいと考えています。


2進数を置き換える方法はありますか?
正規表現はサポートされていますか?

正規表現と同様に、str_replace と strtr の両方を使用できます

たとえば、

$s = str_replace("xEFx9ExB2", "xB2", $s); ただし、
が C0 より大きい場合、プレフィックスは次のようになります。 EF 9F、たとえば E2 は EF 9F に置き換えられます A2

のルールは何ですか?


彼のデータ変換ルールは次のとおりです:
ファイルヘッダーは変更されません。画像から 0050h までは同じです。
>=80 のバイトを変換し、上位ビットに F7 を追加して utf-8 に変換します。たとえば、E2 は F7E2 になり、utf-8 に変換されます。 EF 9F A2 になります

写真の少なくとも E2/FB/ 91/B2/81...すべてこのルールを満たします

彼が示しているのは sqlite データベース ファイルです。明らかに、バイト値 0x00 ~ 0xff を持つあらゆる種類のデータをデータベースに保存できます。
#10 が言ったように、それが正しいことが確認できたら、関数を作成します。そしてそれは完了します
アルゴリズムテスト

$s =<<< TXT00 2D EF 8F A2 1A 05 00 00 00 01 03 EF 9F BB 0000 00 00 0E 03 EF 9F BB 02 6B 01 EF 9E 91 02 3600 EF 9E B2 01 60 00 EF 9E 81 00 EF 9E 81 00 2FTXT;$s = preg_replace("/[ \r\n]/", '', $s);$s = pack('H*', $s); //构造出二进制数据$m = 0;for($i=0; $i<strlen($s); $i++) {  $c = ord($s{$i});  if($c == 0xEF) {    $c = $c & 0x0f;    $c = ($c << 6) + (ord($s{++$i}) & 0x3f);    $c = ($c << 6) + (ord($s{++$i}) & 0x3f);    $c &= 0xff;  }  printf('%02X ', $c);  if(($m = ($m+1) % 16) == 0) echo PHP_EOL;}
ログイン後にコピー
00 2D E2 1A 05 00 00 00 01 03 FB 00 00 00 00 0E
03 FB 02 6B 01 91 02 36 00 B2 01 60 00 81 00 81
0 0 2F

str_replace、strtr
$s = str_replace("xEFx9ExB2", "xB2", $s); などの正規表現も使用できます

ただし、
が C0 より大きい場合は、次のようにプレフィックス EF 9F を追加します。 E2 を EF 9F A2 に置き換える
ルールは何ですか?

値が C0 より大きい場合、プレフィックスは EF 9F です。この正規表現をどのように記述するか?

は正規表現を使用して次のように記述できます

データが変数 $s に格納されていると仮定すると、

$s = preg_replace_callback('/[\xef]../', 'foo', $s);function foo($r) {  $c = (ord($r[0]{1}) & 0x03) << 6;  $c += (ord($r[0]{2}) & 0x3f);  return chr($c);}
ログイン後にコピー


彼が例示しているのは sqlite データベース ファイルです。明らかに、あらゆる種類のデータをデータベースに格納できます。 、バイト値が 0x00 - 0xff如 #10 が言っていることが確認できたら、それを取得する関数を書いてください 00 81 00 81

00 2F

さらに、お聞きしたいのですが、この方法で変換された $c が文字形式で出力され、16 進数でファイルに書き戻された場合、どう対処すればよいでしょうか。
$raw[$j++]=$c;//raw を使用します
受け取った元のデータです
いいえ、もう一度変換する必要がありますか?
$raw を使用してファイルを直接書き込みたいです。

バイナリ データには、印刷できない文字が多く含まれており、直感的に確認できるように、通常は 1 バイトと 2 つの 16 進数の形式で印刷されます (マップ内のソフトウェアなど)

16 進数を変換するには、10 を変更します。文字列をバイナリデータに変換するには、通常、pack('H*', 'ffffff') を使用します

php5.4 は hex2bin も提供します

echo hex2bin("6578616d706c65206865782064617461"); // 16 進データの例


ありがとうございます、学びました

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPとPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

アクション中のPHP:実際の例とアプリケーション アクション中のPHP:実際の例とアプリケーション Apr 14, 2025 am 12:19 AM

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHPでの安全なパスワードハッシュ(例:Password_hash、password_verify)を説明します。 MD5またはSHA1を使用してみませんか? PHPでの安全なパスワードハッシュ(例:Password_hash、password_verify)を説明します。 MD5またはSHA1を使用してみませんか? Apr 17, 2025 am 12:06 AM

PHPでは、Password_hashとpassword_verify関数を使用して安全なパスワードハッシュを実装する必要があり、MD5またはSHA1を使用しないでください。 1)password_hashセキュリティを強化するために、塩値を含むハッシュを生成します。 2)password_verifyハッシュ値を比較して、パスワードを確認し、セキュリティを確保します。 3)MD5とSHA1は脆弱であり、塩の値が不足しており、最新のパスワードセキュリティには適していません。

PHPは、ファイルを安全に処理する方法をどのように処理しますか? PHPは、ファイルを安全に処理する方法をどのように処理しますか? Apr 10, 2025 am 09:37 AM

PHPは、$ \ _ファイル変数を介してファイルのアップロードを処理します。セキュリティを確保するための方法には次のものが含まれます。1。アップロードエラー、2。ファイルの種類とサイズを確認する、3。ファイル上書きを防ぐ、4。ファイルを永続的なストレージの場所に移動します。

PHP:Web開発の重要な言語 PHP:Web開発の重要な言語 Apr 13, 2025 am 12:08 AM

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか? スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか? Apr 17, 2025 am 12:25 AM

PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。

PHPの永続的な関連性:それはまだ生きていますか? PHPの永続的な関連性:それはまだ生きていますか? Apr 14, 2025 am 12:12 AM

PHPは依然として動的であり、現代のプログラミングの分野で重要な位置を占めています。 1)PHPのシンプルさと強力なコミュニティサポートにより、Web開発で広く使用されています。 2)その柔軟性と安定性により、Webフォーム、データベース操作、ファイル処理の処理において顕著になります。 3)PHPは、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

PHP対Python:違いを理解します PHP対Python:違いを理解します Apr 11, 2025 am 12:15 AM

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

See all articles