Элегантный способ разбить шестнадцатеричную строку на байт 00? - PullRequest
1 голос
/ 25 июня 2019

Мне нужно разбить шестнадцатеричную строку на каждый 00 байт. Я попробовал это:

string.split('00');

Но это приводит к расщеплению, например, на 5009, что неверно, поскольку разбивает байт пополам.

Другими словами, он превращается 5009 в [5, 9], чего я не хочу. Но я хочу, чтобы он превратил af0059 в [af, 59].

Можно ли даже разделить байты с помощью регулярных выражений, не разрезая байты пополам?

Я мог бы использовать цикл для поиска по строке и делить строку только по индексам четных чисел, но я бы предпочел выражение регулярного выражения.

Ответы [ 3 ]

2 голосов
/ 25 июня 2019

Из-за размеров байтов вам нужно сначала 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 голос
/ 25 июня 2019

Вот такой подход «старой школы», но он демонстрирует принцип. Я говорю «старая школа», потому что нам приходилось делать это все время, еще во времена программирования на ассемблере.'string' содержит вашу длинную строку шестнадцатеричных пар (байтов).Здесь я конвертирую его в байтовые значения.Измените «строку» на то, что вы хотите, но убедитесь, что она имеет четное число шестнадцатеричных цифр.Вызовите «translate», чтобы продемонстрировать это, и отформатируйте вывод в 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);
    }   
0 голосов
/ 25 июня 2019

Возможно не самый элегантный, но работает

const inp = "af00b9e00f70"
const out = inp.match(/.{1,2}/g).map(a=>a=="00"?"_":a).join("").split("_");
console.log(out);
...