将十六进制数据写入文件

use*_*505 3 php

我正在尝试一段代码.

<?php
$tmp = ord('F'); //gives the decimal value of character F (equals 70)
$tmp = $tmp - 55; //gives 15 - decimal equivalent of 0x0F
$tmp = dechex($tmp); // converts 15 to 0x0F
$fp = fopen("testing.data","wb+");
fwrite($fp,$tmp);
fclose($fp);
?>
Run Code Online (Sandbox Code Playgroud)

当我在十六进制编辑器中打开名为testing.data的文件时,我看到写入了2个字节.2个字节是0x36和0x33.我期待只有1个字节,即0x0f将被写入文件.这不会发生.这个你能帮我吗.

kni*_*ttl 6

您正在将数字0x0F的字符串表示写入文件(每个字符将使用1个字节).

在PHP中,您将使用该pack函数来创建二进制字符串.

$bindata = pack('n', 0x0F);
file_put_contents('testing.data', $bindata);
Run Code Online (Sandbox Code Playgroud)


Jon*_*Jon 6

如果要将字节写入0x0f文件,只需使用该ASCII代码编写字符即可.你实际上想要撤消ord,反向功能是chr:

<?php
$tmp = ord('F'); //gives the decimal value of character F (equals 70)
$tmp = $tmp - 55; //gives 15 - decimal equivalent of 0x0F
$tmp = chr($tmp); // converts 15 to a character
$fp = fopen("testing.data","wb+");
fwrite($fp,$tmp);
fclose($fp);
?>
Run Code Online (Sandbox Code Playgroud)

  • +1`chr`更容易,并在这里完成工作.`pack`虽然更通用,但允许使用指定的字节顺序格式(little-endian,big-endian等)转换多字节值. (2认同)