Javascript 在字节00处拆分十六进制字符串的优雅方式?

Javascript 在字节00处拆分十六进制字符串的优雅方式?,javascript,regex,string,split,hex,Javascript,Regex,String,Split,Hex,我需要在每个00字节拆分一个十六进制字符串。我试过这个: string.split('00'); 但这会导致在5009处发生拆分,例如,这是不正确的,因为它将一个字节拆分为两半 换句话说,它将5009转换为[5,9],这是我不想要的。但我确实希望它将af0059转换为[af,59] 甚至可以使用正则表达式拆分字节,而不将任何字节减半吗 我可以使用循环来搜索字符串,只在偶数索引处分割字符串,但我更喜欢正则表达式。由于字节大小的原因,您需要首先将字符串分割成字节大小,然后映射,最后连接 cons

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

string.split('00');
但这会导致在
5009
处发生拆分,例如,这是不正确的,因为它将一个字节拆分为两半

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

甚至可以使用正则表达式拆分字节,而不将任何字节减半吗


我可以使用循环来搜索字符串,只在偶数索引处分割字符串,但我更喜欢正则表达式。

由于字节大小的原因,您需要首先
将字符串分割成字节大小,然后
映射
,最后
连接

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(“”;

控制台日志(res)也许不是最优雅的,但它可以工作

常量inp=“af00b9e00f70” const out=inp.match(/.{1,2}/g).map(a=>a==“00”?“:a).join(“”).split(“”); 控制台。注销;
这里有一种有点“老派”的方法,但它展示了原理。我说“老派”是因为在汇编代码时代,我们必须一直这样做string'包含十六进制对(字节)的长字符串。这里我将其转换为字节值。将“字符串”更改为您想要的任何值,但请确保它包含偶数个十六进制数字。调用“translate”进行演示,并将输出格式化为alert()(或仅输出到控制台)

var值=[];//输出阵列
var string=“000102030405060708090A0B0C0D0E0F1FFFFFDFCFBFAF9F8F7F6F5F4F2F0”;
函数getHexByteValues(字符串){
var hex=“0123456789ABCDEF”;
var-outIx=0;

对于(var i=0;i)为什么我的问题会立即被否决?你不是
.split()
ing一个十六进制数,你是在字符串上操作。字符串中有“两个字符”字节的定义。(我没有否决你).我的观点是字符串就是字符串。在UTF-16中,每个字符有两个字节,但您指的是每个字节两个字符(好像它是一个十六进制数).我可以给出一个有点老套的解决方案,但在我理解之前…字符串中填充了十六进制数字,其中每对都是一个数字,对吗?@CocoDaWhiteBerry我没有特别看它,因为我在发布时正在挖掘我自己的示例/解决方案。但是如果解决方案不起作用,你不应该取消选中它吗他“最终答案”并检查一个答案(我不知道Stackoverflow是否允许你这么做)。这不起作用。
af00b9e00f70
在我删除
连接(“”)时转到
['af','b9e0','0f70']
。我不希望它将
b9e00f70
拆分为两个单独的字符串。因为这需要将一对字符拆分为两半。嘿,这正是我所追求的优雅风格,这可能是实现我目标的最短代码。它工作得非常完美。请注意,要改进对word或32的调用位值,您可以添加一个“内部”循环,其限制为半字节/值的数量。或者要转换复杂结构,其中十六进制字符串表示不同偏移量下的不同对象大小,您可能需要包含一个“映射”数组,其中每个元素指定要分析的半字节数。当然,您还有一个老问题,即知道任何具有2个或更多字节的对象的“字节顺序”。上述代码可以简化或扩展,但这只是一个开始
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);
    }