![](/img/trans.png)
[英]Most elegant way to split a string and find its resulting ordered combinations
[英]Elegant way to split hex string at byte 00?
我需要在每00
字節分割一個十六進制字符串。 我試過這個:
string.split('00');
但是這會導致分裂為5009
,例如,這是不正確的,因為它將一個字節分成兩半。
換句話說,它將5009
變為[5, 9]
5009
[5, 9]
,這是我不想要的。 但我確實希望它在af0059
轉到[af, 59]
。
甚至可以使用正則表達式來分割字節,而不會將任何字節減少一半?
我可以使用循環來搜索字符串,只在偶數索引處划分字符串,但我更喜歡正則表達式。
由於字節大小,您需要先將字符串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);
這是一個有點“老派”的方法,但它證明了校長。我說“老學校”因為我們必須在匯編編碼的時候一直這樣做。 '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);
}
也許不是最優雅的,但它的確有效
const inp = "af00b9e00f70"
const out = inp.match(/.{1,2}/g).map(a=>a=="00"?"_":a).join("").split("_");
console.log(out);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.