【问题标题】:Regex split numbers正则表达式拆分数字
【发布时间】:2018-01-30 15:06:37
【问题描述】:

我有一串十六进制数字 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)

【问题讨论】:

  • 啊..我的眼睛!...啊谢谢你 ctwheels
  • 请验证我所做的更改是否合适。另外,请参阅Markdown help
  • 第一个尝试parseInt('030c3f0f020039'.slice(0,2), 16)

标签: javascript regex typescript ecmascript-6


【解决方案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)从十六进制转换为十进制。


不过,这种方法比它应该的要直接得多:如果一个值在其十六进制表示中中有有意义的 0 怎么办?查看“03030f”,我们将无法推断出该字符串中是否编码了一个、两个或三个值。

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

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));

【讨论】:

  • 我正要回答:"030c3f0f020039".match(/(0+[a-f1-9]*)/g)
  • 我认为这在很多情况下都会失败。 1)它使用前导零来检测字段。如果数据不以前导零开头怎么办? 2) 它不匹配重要的零。
  • 你是对的,这个解决方案是针对 OP 描述的非常具体的情况。最安全的方法是完全放弃限制器 - 并使用固定宽度的字段来传递值。我会用这个更新我的答案。
  • 如果我的十六进制不以“0”开头会怎样?
  • 第二个sn-p?当然,因为它根本不依赖于那些字符。不禁想知道,顺便说一句,那个字符串是从哪里来的。
猜你喜欢
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多