FFXI五位十进制颜色码转Hex色码PHP函数问题求助
修正FFXI Linkshell颜色码转Hex的PHP函数
你的函数存在两个核心问题:
- 颜色通道的提取顺序不符合FFXI的存储格式
- 5位到8位的颜色值转换方式不准确(左移3位无法覆盖0-255的完整范围)
FFXI的Linkshell颜色采用RGB555格式(每通道5位,总计15位),标准存储顺序为R(高5位)、G(中5位)、B(低5位)。同时,5位值转8位值需要按比例缩放(0-31映射到0-255),而不是简单左移3位。
修正后的函数如下:
function ffxiLinkshellColorToHex($color) { // 提取RGB555各通道的5位值 $r5 = ($color >> 10) & 0x1F; $g5 = ($color >> 5) & 0x1F; $b5 = $color & 0x1F; // 将5位值按比例缩放为8位(0-255) $r = round($r5 * 255 / 31); $g = round($g5 * 255 / 31); $b = round($b5 * 255 / 31); // 格式化为两位十六进制字符串 $hexR = str_pad(dechex($r), 2, '0', STR_PAD_LEFT); $hexG = str_pad(dechex($g), 2, '0', STR_PAD_LEFT); $hexB = str_pad(dechex($b), 2, '0', STR_PAD_LEFT); return "#{$hexR}{$hexG}{$hexB}"; }
如果你的数据库中存储的是BGR顺序的颜色码(部分场景下会出现),只需交换R和B的提取逻辑:
function ffxiLinkshellColorToHex($color) { // 提取BGR555各通道的5位值,转换为RGB $b5 = ($color >> 10) & 0x1F; $g5 = ($color >> 5) & 0x1F; $r5 = $color & 0x1F; $r = round($r5 * 255 / 31); $g = round($g5 * 255 / 31); $b = round($b5 * 255 / 31); $hexR = str_pad(dechex($r), 2, '0', STR_PAD_LEFT); $hexG = str_pad(dechex($g), 2, '0', STR_PAD_LEFT); $hexB = str_pad(dechex($b), 2, '0', STR_PAD_LEFT); return "#{$hexR}{$hexG}{$hexB}"; }
关于测试用例的说明
你提到输入61648预期输出#00EF00,但按标准FFXI颜色码格式,该输入对应的Hex应为#E63183(RGB555)或#8331E6(BGR555)。如果你的数据库存储格式特殊,可根据实际通道顺序调整提取逻辑,核心是确保5位值的缩放方式正确。
内容的提问来源于stack exchange,提问作者SaveZeQueen
相关产品推荐
相关产品推荐

