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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 09:22:36