在PHP中,如何在给定偏移量处向文件写入一个无符号字节值?

在PHP中,如何在给定偏移量处向文件写入一个无符号字节值?,php,file,binary,writing,Php,File,Binary,Writing,在PHP手册中,我所能找到的将原始字节写入文件的方法就是fwrite。但是当我使用它(以b模式打开文件)时,它似乎在写字符,而不是原始字节 网络搜索没有发现任何有用的东西 我在文件中使用一个大的字节数组来保存位,表示一个大集合的成员。因为我一次只操作一个位,所以我想读写包含当前更改位的一个原始字节 执行此集合操作的算法很简单,但与我的问题无关,即:如何以偏移量将一个原始字节(或更大的固定长度数据块)写入文件?用于正确打包数据 例如: $a = 1 & 1; $b = pack('i',

在PHP手册中,我所能找到的将原始字节写入文件的方法就是fwrite。但是当我使用它(以b模式打开文件)时,它似乎在写字符,而不是原始字节

网络搜索没有发现任何有用的东西

我在文件中使用一个大的字节数组来保存位,表示一个大集合的成员。因为我一次只操作一个位,所以我想读写包含当前更改位的一个原始字节

执行此集合操作的算法很简单,但与我的问题无关,即:如何以偏移量将一个原始字节(或更大的固定长度数据块)写入文件?

用于正确打包数据

例如:

$a = 1 & 1;
$b = pack('i', $a);
file_put_contents('sample', $b);

然后用十六进制编辑器查看文件
sample

我从PHP新闻组(邮件列表)收到了关于这个主题的良好帮助。尽管PHP手册似乎将fwrite描述为编写字符串或二进制数据,但实际上它只编写字符串。例如,如果将整数值或二进制值0x1作为字节写入,则无论是否在fopen中指定了“b”模式,都会实际写入值0x31


一种解决方案是使用fprintf。例如,
fprintf($Res,“%c”,0x1)
将实际在文件中的当前偏移量处写入字节值0x1。

我的朋友,字符是原始字节,当然,当你打开文件时,你会看到字符:)例如,在记事本中打开exe。你还没有测试它,对吗?fwrite函数将原始字节转换为字符。例如,写入(1&1)是一个位,被写入为31(十六进制)。我将在PHP论坛上提问。@davidscott表达式
1&1
创建一个整数,如果您将其提供给
fwrite()
,该整数将转换为字符串1。如果要创建包含十六进制值0x01的字符串,请使用
“\x01”
。没有回答这个问题。file_put_内容的工作方式类似于fwrite,将字符串写入文件。问题是如何将原始字节(8位无符号整数)写入文件。问题不在于如何打包数据。按位操作可以很好地打包数据。问题是如何在不将数据更改为字符串的情况下写入数据。
pack
的输出不是字符串。通常,PHP中的write函数只处理字符串,不管您给它什么。这里需要注意的是,虽然包的输出是字符串,但它不包含字符“1”,而是整数1本身。如果您回显
$b
,您将看到“\x01”,这表示您要查找的字节。无论如何,如果您真的想使用裸字符串编写与
fwrite
相关的函数来编写整数1,我认为您运气不好。我不知道我的答案对您有何帮助,在写入描述符之前使用
pack
。但无论如何,你得到了你想要的,祝你好运。“Pack”似乎类似于使用序列化:一种让二进制文件写入的黑客。我更喜欢另一个有效的答案,使用格式化文件编写。这只是一种偏好,偏好普通函数而非稀有函数。请不要把这件事当回事。正如我已经说过的,我感谢你的努力。再见。