![](/img/trans.png)
[英]conversion of Byte array to 320 bits and then bit extraction 16 bits then 10 bits
[英]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.