在字节00处分割十六进制字符串的优雅方法?

时间:2019-06-25 00:22:14

标签: javascript regex string split hex

我需要在每个00字节处拆分一个十六进制字符串。我尝试过:

string.split('00');

但是这会导致在5009处进行拆分,这是不正确的,因为它将字节拆分为一半。

换句话说,它将5009变成[5, 9],这是我不想要的。但是我确实希望它将af0059变成[af, 59]

是否甚至可以使用正则表达式拆分字节,而无需将任何字节切成两半?

我可以使用循环来查找字符串,并且仅将字符串除以偶数索引,但是我更希望使用正则表达式。

3 个答案:

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