CAN_EXTRACT_SIGNAL
功能概述
从 CAN 总线报文的数据区(payload)中按位提取一个信号的原始整数值。用于车联网、工业设备等场景:把采集到的原始 CAN 帧直接存入 Lakehouse,再按 DBC 文件中的信号定义(起始位、长度、字节序、是否有符号)用 SQL 解析。
只需要原始值时用本函数;需要按 DBC 中的 factor、offset 换算成物理值(如车速、温度)时,用 CAN_DECODE_SIGNAL。
语法
参数说明
:BINARY 类型,CAN 帧的数据区字节。十六进制字符串可用<data>
转换。CAST(unhex('...') AS BINARY)
:BIGINT 类型,信号的起始位,与 DBC 文件中的定义一致。位编号为<start_bit>
,字节内位号 0 是最低位。字节序号 × 8 + 字节内位号- Intel 字节序:起始位是信号的最低位(LSB)。
- Motorola 字节序:起始位是信号的最高位(MSB),按 DBC 的锯齿形编号向后取位。
:BIGINT 类型,信号长度(位数),取值 1 ~ 64。<bit_length>
:STRING 类型,字节序,不区分大小写:<byte_order>- 小端:
、'intel'
、'little''i' - 大端:
、'motorola'
、'big''m'
- 小端:
:BOOLEAN 类型,<is_signed>
表示按补码解释为有符号数,true
表示无符号数。false
返回 BIGINT 类型。
使用示例
Intel 字节序,从第 0 位取 8 位:
0x2A 即 42:
| raw |
|---|
| 42 |
以下示例中字节从 0 开始编号。
跨字节的信号。Intel 字节序从第 8 位取 9 位,取的是第 1 字节全部 8 位(
0x80)加第 2 字节最低位(1),结果为 0x180:
| raw |
|---|
| 384 |
Motorola 字节序,起始位 15 是第 1 字节(
0x01)的最高位。从这里向后取 9 位:先取第 1 字节的 8 位 00000001,再取第 2 字节(0x00)的最高位 0,拼成二进制 000000010:
| raw |
|---|
| 2 |
有符号与无符号解释:
0xFF 作为 8 位有符号数是 -1:
| signed_val | unsigned_val | bad_len |
|---|---|---|
| -1 | 255 | NULL |
注意事项
- 起始位和字节序的定义与 DBC 文件一致,可以直接照抄 DBC 中的信号定义。
- 参数不合法时返回 NULL 而不是报错。
相关文档
- CAN_DECODE_SIGNAL:提取并换算为物理值
- UNHEX
联系我们
