Table of Contents
回复讨论(解决方案)
Home Backend Development PHP Tutorial php接收二进制文件怎么替换里面的内容

php接收二进制文件怎么替换里面的内容

Jun 23, 2016 pm 02:08 PM

php接收二进制文件如下:
header('Content-type: text/html; charset=utf-8'); 
error_reporting(0); 
$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;//得到post过来的二进制原始数据
$file = fopen("./upload/".$filename,"w");//打开文件准备写入
fwrite($file,$raw);//写入
fclose($file);//关闭
?>

接收的二进制文件中非标准字符(>0x7F)的字节被替换为三个字节,比如E2替换为EF 9F A2
现在我想在Php接收到文件之后还原回去,把EF 9F A2替换为E2,请问这个怎么实现?

非常感谢!


回复讨论(解决方案)

你收到的不是一个 XML 流吗?
是文本文件而非二进制文件呀
>0x7F 的不都是 utf-8 宽字符吗?

你最好贴出 $raw 的内容看看

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

补充
utf-8的EF 9F A2 应该是unicode F7E2 而不是 E2
且E000-F8FF属于用户自定义字符(就是没有字符集以外,交给用户使用的区域)
举例就是某些通信接口用自定义字符来做边界识别

要留意这个

发送端,格式是这样设置的:
if (xmlhttp.overrideMimeType) {
xmlhttp.overrideMimeType('text/plain; charset=x-user-defined');
} else {
xmlhttp.setRequestHeader('Accept-Charset', 'x-user-defined');
}
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.Uint8Array(ords);
this.send(ui8a.buffer);
 }
xmlhttp.sendAsBinary(content);

在PC上用IE浏览器就可以。
但是我需要用在android 浏览器上,不支持这个函数Uint8Array,所以不知道怎么用二进制流发送了。

比较发送文件和接收文件,还是有规律的:
大于C0的加前缀为EF 9F,如E2替换为EF 9F A2
小于C0的加前缀为EF 9E,如B2替换为EF 9E B2

这样的编码不知道是怎么出来的?所以想说对接收文件的十六进制做替换,只要结果正确就行了。

有没有什么方法可以替换二进制数的?
正则表达式能支持吗?

str_replace、strtr 都可以,正则也可以

$s = str_replace("\xEF\x9E\xB2", "\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;}
Copy after login
Copy after login
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
00 2F

str_replace、strtr 都可以,正则也可以

$s = str_replace("\xEF\x9E\xB2", "\xB2", $s);

不过
大于C0的加前缀为EF 9F,如E2替换为EF 9F A2
的规则是什么?

大于C0的加前缀为EF 9F,将EF 9F A2替换为A2+40,这个正则表达式怎么写呢?

用正则可这样写
假定数据已把存在变量 $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);}
Copy after login

他图示的是 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;}
Copy after login
Copy after login
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 
00 2F 

另外请教下,这样转换的$c是字符形式打印出来,如果以十六进制写回文件,要怎么处理?
我用
$raw[$j++]=$c;//raw是接收到的原始数据
不行,应该还要再转换一下吗?
我是想用$raw直接写文件的。

二进制数据中包含了很多不可打印的字符,为了直观的看到他们,一般将其以一个字节两个十六进制数的格式打印出来(比如你贴图中的软件)

将十六进制串转换成二进制数据,一般可用 pack('H*', 'ffffff')
php5.4 还提供了一个 hex2bin
echo hex2bin("6578616d706c65206865782064617461"); //example hex data

非常感谢,学习了 

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Roblox: Bubble Gum Simulator Infinity - How To Get And Use Royal Keys
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusion System, Explained
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers Of The Witch Tree - How To Unlock The Grappling Hook
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1664
14
PHP Tutorial
1269
29
C# Tutorial
1249
24
PHP and Python: Comparing Two Popular Programming Languages PHP and Python: Comparing Two Popular Programming Languages Apr 14, 2025 am 12:13 AM

PHP and Python each have their own advantages, and choose according to project requirements. 1.PHP is suitable for web development, especially for rapid development and maintenance of websites. 2. Python is suitable for data science, machine learning and artificial intelligence, with concise syntax and suitable for beginners.

Explain secure password hashing in PHP (e.g., password_hash, password_verify). Why not use MD5 or SHA1? Explain secure password hashing in PHP (e.g., password_hash, password_verify). Why not use MD5 or SHA1? Apr 17, 2025 am 12:06 AM

In PHP, password_hash and password_verify functions should be used to implement secure password hashing, and MD5 or SHA1 should not be used. 1) password_hash generates a hash containing salt values ​​to enhance security. 2) Password_verify verify password and ensure security by comparing hash values. 3) MD5 and SHA1 are vulnerable and lack salt values, and are not suitable for modern password security.

PHP in Action: Real-World Examples and Applications PHP in Action: Real-World Examples and Applications Apr 14, 2025 am 12:19 AM

PHP is widely used in e-commerce, content management systems and API development. 1) E-commerce: used for shopping cart function and payment processing. 2) Content management system: used for dynamic content generation and user management. 3) API development: used for RESTful API development and API security. Through performance optimization and best practices, the efficiency and maintainability of PHP applications are improved.

PHP: A Key Language for Web Development PHP: A Key Language for Web Development Apr 13, 2025 am 12:08 AM

PHP is a scripting language widely used on the server side, especially suitable for web development. 1.PHP can embed HTML, process HTTP requests and responses, and supports a variety of databases. 2.PHP is used to generate dynamic web content, process form data, access databases, etc., with strong community support and open source resources. 3. PHP is an interpreted language, and the execution process includes lexical analysis, grammatical analysis, compilation and execution. 4.PHP can be combined with MySQL for advanced applications such as user registration systems. 5. When debugging PHP, you can use functions such as error_reporting() and var_dump(). 6. Optimize PHP code to use caching mechanisms, optimize database queries and use built-in functions. 7

The Enduring Relevance of PHP: Is It Still Alive? The Enduring Relevance of PHP: Is It Still Alive? Apr 14, 2025 am 12:12 AM

PHP is still dynamic and still occupies an important position in the field of modern programming. 1) PHP's simplicity and powerful community support make it widely used in web development; 2) Its flexibility and stability make it outstanding in handling web forms, database operations and file processing; 3) PHP is constantly evolving and optimizing, suitable for beginners and experienced developers.

How does PHP type hinting work, including scalar types, return types, union types, and nullable types? How does PHP type hinting work, including scalar types, return types, union types, and nullable types? Apr 17, 2025 am 12:25 AM

PHP type prompts to improve code quality and readability. 1) Scalar type tips: Since PHP7.0, basic data types are allowed to be specified in function parameters, such as int, float, etc. 2) Return type prompt: Ensure the consistency of the function return value type. 3) Union type prompt: Since PHP8.0, multiple types are allowed to be specified in function parameters or return values. 4) Nullable type prompt: Allows to include null values ​​and handle functions that may return null values.

PHP and Python: Code Examples and Comparison PHP and Python: Code Examples and Comparison Apr 15, 2025 am 12:07 AM

PHP and Python have their own advantages and disadvantages, and the choice depends on project needs and personal preferences. 1.PHP is suitable for rapid development and maintenance of large-scale web applications. 2. Python dominates the field of data science and machine learning.

PHP vs. Other Languages: A Comparison PHP vs. Other Languages: A Comparison Apr 13, 2025 am 12:19 AM

PHP is suitable for web development, especially in rapid development and processing dynamic content, but is not good at data science and enterprise-level applications. Compared with Python, PHP has more advantages in web development, but is not as good as Python in the field of data science; compared with Java, PHP performs worse in enterprise-level applications, but is more flexible in web development; compared with JavaScript, PHP is more concise in back-end development, but is not as good as JavaScript in front-end development.

See all articles