正则表达式分裂数字

时间:2018-01-30 15:06:37

标签: javascript regex typescript ecmascript-6

我有一串十六进制数字030c3f0f020039,但我希望按照以下模式03 0c3f 0f 02 0029拆分数字并将它们转换为整数。例如:

Message type = 0x03 = 3 (in decimal format)
("030c3f0f020039" , 8-bit unsigned integer)
Battery voltage = 0x0c3f = 3135 millivolts = 3,135 volts (in decimal format)    
("030c3f0f020039" , 16-bit unsigned integer)
Test messages left = 0x0f = 15 (in decimal format)
("030c3f0f020039" ,  8-bit unsigned integer)
Alarm sequence = 0x02 = 2 (in decimal format)
("030c3f0f020039" ,  8-bit unsigned integer)
Sensor AD-value = 0x0039 = 57 (in decimal format)
("030c3f0f020039" , 16-bit unsigned integer)

1 个答案:

答案 0 :(得分:1)

一种可能的方法:

const source = '030c3f0f020039';
const numbers = source.match(/0+[1-9a-f]+/g).map(num => parseInt(num, 16));
console.log(numbers);

使用正则表达式,您可以匹配以一个或多个零开头的字符串部分,后跟任意数量的非零数字或a-f个字母。每个部分都使用parseInt(..., 16)从十六进制转换为十进制。

尽管如此,这种方法远比它应该更直接:如果一个值在里面有意义的十六进制表示怎么办?查看'03030f',我们将无法扣除我们是否在该字符串中编码了一个,两个或三个值。

更好的方法是使用固定长度的“字段”。例如,在这种特殊情况下,“消息类型”,“测试消息剩余”和“警报序列”字段作为8位无符号整数(两个十六进制)发送,并且发送“电池电压”和“传感器AD值”作为16位无符号整数(四个十六进制)。考虑到这一点,我们创建了一个decypher:

const fields = [
  { name: 'Message type',       range: [0, 2] },
  { name: 'Battery voltage',    range: [2, 6] },
  { name: 'Test messages left', range: [6, 8] },
  { name: 'Alarm sequence',     range: [8, 10] },
  { name: 'Sensor AD-value',    range: [10, 14] }
];

function decypher(message) {
  const data = fields.reduce((hash, {name, range}) => {
    hash[name] = parseInt(message.slice(...range), 16);
    return hash;    
  }, {});
  return data;
}

const message = '030c3f0f020039';
console.log(decypher(message));