我需要在每个00
字节处拆分一个十六进制字符串。我尝试过:
string.split('00');
但是这会导致在5009
处进行拆分,这是不正确的,因为它将字节拆分为一半。
换句话说,它将5009
变成[5, 9]
,这是我不想要的。但是我确实希望它将af0059
变成[af, 59]
。
是否甚至可以使用正则表达式拆分字节,而无需将任何字节切成两半?
我可以使用循环来查找字符串,并且仅将字符串除以偶数索引,但是我更希望使用正则表达式。
答案 0 :(得分:2)
由于字节大小,您需要首先将字符串split
转换为字节大小,然后是map
,最后是join
。
const string = "af00b9e00f70";
const res = string.split(/([\d\w]{4})/).filter(e => e).map(e => e.replace(/00([\d\w]{2})/, "$1").replace(/([\d\w]{2})00/, "$1")).join("");
console.log(res);
答案 1 :(得分:1)
这是一个有点“老派”的方法,但是它说明了原理。我说“老派”是因为在汇编程序编码的时代,我们一直都必须这样做。 “字符串”包含您的十六进制对的长字符串(字节)。在这里,我将其转换为字节值。将“字符串”更改为所需的任意值,但请确保其具有偶数个十六进制数字。调用“翻译”进行演示,然后将输出格式化为alert()(或仅输出到控制台)
var values = []; // output array
var string = "000102030405060708090a0b0c0d0e0f1FFFFEFDFCFBFAF9F8F7F6F5F4F3F2F0";
function getHexByteValues( string) {
var hex= "0123456789ABCDEF";
var outIx=0;
for (var i =0; i <= (string.length-2); i +=2) { // skip every other
//get higher and lower nibble
var hexdig1 = string.substring(i, i+1);
var hexdig0 = string.substring(i+1, i+2);
// for simplicity, convert alpha to upper case
hexdig1 = hexdig1.toUpperCase();
hexdig0 = hexdig0.toUpperCase();
// convert hex to decimal value.
// position in lookup string == value
var dec1 = hex.indexOf(hexdig1);
var dec0 = hex.indexOf(hexdig0);
// calc "byte" value, and add to values.
values[outIx++] = dec1 * 16 + dec0;
}
}
function translate(string) {
getHexByteValues(string);
var output="";
for (var i =0; i < values.length; i++) {
output += i + " = " + values[i] + "\r\n";
}
alert (output);
}
答案 2 :(得分:0)
也许不是最优雅的,但它能起作用
const inp = "af00b9e00f70"
const out = inp.match(/.{1,2}/g).map(a=>a=="00"?"_":a).join("").split("_");
console.log(out);