在PHP中,如何在给定偏移量处向文件写入一个无符号字节值?
在PHP手册中,我所能找到的将原始字节写入文件的方法就是fwrite。但是当我使用它(以b模式打开文件)时,它似乎在写字符,而不是原始字节 网络搜索没有发现任何有用的东西 我在文件中使用一个大的字节数组来保存位,表示一个大集合的成员。因为我一次只操作一个位,所以我想读写包含当前更改位的一个原始字节 执行此集合操作的算法很简单,但与我的问题无关,即:如何以偏移量将一个原始字节(或更大的固定长度数据块)写入文件?用于正确打包数据 例如:在PHP中,如何在给定偏移量处向文件写入一个无符号字节值?,php,file,binary,writing,Php,File,Binary,Writing,在PHP手册中,我所能找到的将原始字节写入文件的方法就是fwrite。但是当我使用它(以b模式打开文件)时,它似乎在写字符,而不是原始字节 网络搜索没有发现任何有用的东西 我在文件中使用一个大的字节数组来保存位,表示一个大集合的成员。因为我一次只操作一个位,所以我想读写包含当前更改位的一个原始字节 执行此集合操作的算法很简单,但与我的问题无关,即:如何以偏移量将一个原始字节(或更大的固定长度数据块)写入文件?用于正确打包数据 例如: $a = 1 & 1; $b = pack('i',
$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”似乎类似于使用序列化:一种让二进制文件写入的黑客。我更喜欢另一个有效的答案,使用格式化文件编写。这只是一种偏好,偏好普通函数而非稀有函数。请不要把这件事当回事。正如我已经说过的,我感谢你的努力。再见。