如何将Grafana面板查询结果的十进制数值转换为ASCII字符?
解决Grafana中将数值转换为ASCII字符拼接的问题
针对你使用Grafana v10.2.2 + InfluxDB的场景,把数值(如12360=0x3048)转换为对应ASCII字符拼接(如"0H"),可以用以下两种方案:
方案1:在InfluxDB查询阶段直接处理(推荐)
在数据源端完成转换,性能更优,避免Grafana端额外计算。
若使用Flux查询(InfluxDB 2.x)
假设你的字段名为value,修改查询语句,通过map函数拆分字节并转换为ASCII字符串:
from(bucket: "你的桶名") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r._measurement == "你的测量名" and r._field == "value") |> map(fn: (r) => ({ r with ascii_str: string(v: uint(v: r._value) >> 8) + string(v: uint(v: r._value) & 0xFF) }))
查询结果会新增ascii_str字段,直接显示拼接后的ASCII字符串。
若使用InfluxQL查询(InfluxDB 1.x)
利用CHR()函数将拆分后的字节值转为ASCII字符,再拼接:
SELECT CHR("value" >> 8) || CHR("value" & 0xFF) AS ascii_str FROM "你的测量名" WHERE time >= now() - 1h
value >> 8提取高字节,value & 0xFF提取低字节,CHR()转成对应ASCII字符,||完成拼接。
方案2:在Grafana面板内处理(无需修改查询)
如果无法调整数据源查询,可在Grafana端通过字段格式化或Transform实现:
方法A:自定义字段格式化
- 进入面板的
Overrides选项卡 - 点击
Add override,选择需要处理的目标字段(如value) - 找到
Field formatting,选择Custom类型 - 在
Custom formatter输入框中写入JS函数:
(value) => { const highByte = (value >> 8) & 0xFF; const lowByte = value & 0xFF; return String.fromCharCode(highByte) + String.fromCharCode(lowByte); }
设置完成后,该字段的显示值会自动转换为ASCII拼接字符串。
方法B:通过Transform新增字段
- 进入面板的
Transform选项卡 - 点击
Add transformation,选择Add field from calculation - 设置新字段名称(如
ASCII字符串) - 在
Calculation中选择Custom,输入表达式:
String.fromCharCode((value >> 8) & 0xFF) + String.fromCharCode(value & 0xFF)
注意确保表达式中的value对应你要处理的原字段名,新增的字段会显示转换后的结果。
内容的提问来源于stack exchange,提问作者fruitCoder
相关产品推荐
相关产品推荐

