You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中如何将BMP图像转换为十六进制数组?现有代码失效求助

问题分析

先看你写的函数,有两个明显的问题导致它无法正常运行:

  1. 循环里误用了未定义的变量$test,应该是你声明的$bmp变量;
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:57:42