PHP中如何将BMP图像转换为十六进制数组?现有代码失效求助
问题分析
先看你写的函数,有两个明显的问题导致它无法正常运行:
- 循环里误用了未定义的变量
$test,应该是你声明的$bmp变量; dechex()返回的十六进制值可能是1位(比如字节值为5时返回5),直接拼接会导致最终的十六进制字符串长度不规范——每个字节应该固定为两位十六进制字符。
有没有PHP内置函数实现?
当然有!PHP自带的bin2hex()函数可以直接把二进制字符串转换成连续的十六进制字符串,效率比手动循环高得多。比如你要把整个BMP文件转成十六进制字符串,一行代码就能搞定:
$hexString = bin2hex(file_get_contents('your-image.bmp'));
正确的手动实现方式
如果一定要自己写循环处理,修正后的函数应该是这样的:
function bmp_to_hex($filename) { $bmp = file_get_contents($filename); $output = ''; $length = strlen($bmp); for($i=0; $i < $length; $i++) { // 用str_pad补零,确保每个字节输出两位十六进制 $output .= str_pad(dechex(ord($bmp[$i])), 2, '0', STR_PAD_LEFT); } return $output; }
如何获取十六进制代码数组?
如果你的需求是把每个字节的十六进制值单独存到数组里(而不是拼接成字符串),可以这样实现:
function bmp_to_hex_array($filename) { $bmp = file_get_contents($filename); $hexArray = []; foreach(str_split($bmp) as $byte) { $hexArray[] = str_pad(dechex(ord($byte)), 2, '0', STR_PAD_LEFT); } return $hexArray; }
或者用更简洁的array_map写法:
$bmpData = file_get_contents('your-image.bmp'); $hexArray = array_map(function($byte) { return str_pad(dechex(ord($byte)), 2, '0', STR_PAD_LEFT); }, str_split($bmpData));
额外补充:只提取像素数据的十六进制
BMP文件包含文件头、信息头和像素数据三部分,如果你只需要像素部分的十六进制数组,可以解析BMP的偏移量来定位像素区域(更通用的方式,避免硬编码头长度):
function bmp_pixels_to_hex_array($filename) { $bmp = file_get_contents($filename); // 从文件头第10字节处读取像素数据的偏移位置(4字节小端整数) $pixelOffset = unpack('V', substr($bmp, 10, 4))[1]; // 截取像素数据部分 $pixelData = substr($bmp, $pixelOffset); // 转换为十六进制数组 return array_map(function($byte) { return str_pad(dechex(ord($byte)), 2, '0', STR_PAD_LEFT); }, str_split($pixelData)); }
内容的提问来源于stack exchange,提问作者Jorge Palacios Zaratiegui
相关产品推荐
相关产品推荐

