簡體   English   中英

從字節數組中提取位

[英]Extract bits from a byte array

我正在嘗試制作一個 function,它從字節數組中提取位並從中返回十進制 output。

function to_uint(x) {
    return x >>> 0;
}

function trunc(v){
    v = +v;
    if (!isFinite(v)) return v;
    return (v - v % 1)   ||   (v < 0 ? -0 : v === 0 ? v : 0);
}

function extract_bytes(chunk, startBit, endBit) {
    var totalBits = startBit - endBit + 1;
    var totalBytes = totalBits % 8 === 0 ? to_uint(totalBits / 8) : to_uint(totalBits / 8) + 1;
    var bitOffset = endBit % 8;
    var arr = new Array(totalBytes);
    for (var byte = totalBytes-1; byte >= 0; byte--) {
        var chunkIndex = byte + (chunk.length - 1 - trunc(startBit / 8));
        var lo = chunk[chunkIndex] >> bitOffset;
        var hi = 0;
        if (byte !== 0) {
            var hi_bitmask = (1 << bitOffset) - 1
            var bits_to_take_from_hi = 8 - bitOffset
            hi = (chunk[chunkIndex - 1] & (hi_bitmask << bits_to_take_from_hi));
        } else {
            lo = lo & ((1 << (totalBits % 8 ? totalBits % 8 : 8)) - 1);
        }
        arr[byte] = hi | lo;
    }
return arr;
}

這些是我為此使用的功能。

例如,我會這樣稱呼它:

chunk = [0x0C, 0x47, 0x14, 0x76]
startBit = 1;
endBit = 0;
console.log(extract_bytes(chunk, startBit, endBit));

在大多數情況下,此功能在位(開始和結束)時工作正常。 但是當我嘗試讀取數據位於兩個不同字節中的位時,它會失敗。 這是我將使用的塊的一些視圖:

 //    0x0C      0x47      0x14      0x76
 //  [byte 0 ] [byte 1 ] [byte 2 ] [byte 3 ]
 //  0000 1100 0100 0111 0001 0100 0111 0110

例如:

chunk = [0x0C, 0x47, 0x14, 0x76]
startBit = 8
endBit = 0

這有效並返回:

[ 0, 118 ]

這意味着它從 byte3 (0x76) 提取了全部內容(索引 7-0),而在 byte2 (0x14) 中提取了索引 8。

但是當我嘗試時:

chunk = [0x0C, 0x47, 0x14, 0x76]    
startBit = 11    
endBit = 6    

它返回 [0] 而不是 [17]

我是程序員,但從未見過“===”或“>>>”運算符; 你應該知道你是使用小端還是大端規則; 你有 (startBit,endBit) 或 )startBit,endBit)(排除)嗎? 也許你應該試試這個程序:。 將所有字節分類為位串,例如:[0x0C, 0x47, 0x14, 0x76] -> "00001100"+"..."+... 。 反轉字符串。 將 startBit 和 endBit 之間的所有元素提取到新字符串中。 再次反轉此字符串。 之后,您可以將此字符串“夾入”列表並轉換為 int

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM