在javascript中从一个字节中获取两个半字节的最佳方法?

Geu*_*uis 15 javascript byte nibble

我在javascript中解析一个二进制文件,每个字节存储两条信息,每个半字节一个.这些值当然是0-16和0-16.

在文件格式的所有其他部分中,每个字节代表一条信息,因此我一直使用以下方法成功获取所需的数字值:

var num = str.charCodeAt(0) & 0xFF;
Run Code Online (Sandbox Code Playgroud)

但是我一直试图弄清楚如何获得第一个半字节的0-16值,并且从我的单字节字符"str"获得第二个半字节的值.

感谢任何帮助.

sje*_*397 15

var num = str.charCodeAt(0) & 0xFF;
var nibble1 = num & 0xF;
var nibble2 = num >> 4;
Run Code Online (Sandbox Code Playgroud)


cod*_*ict 15

你可以做:

var num = str.charCodeAt(0);
var lower_nibble = (num & 0xF0) >> 4;
var higher_nibble = num & 0x0F;
Run Code Online (Sandbox Code Playgroud)

它是如何工作的?

让我们假设比特表示numabcdwxyz,我们想提取abcd更高的半字节和wxyz更低的半字节.

要提取较低的半字节,我们只需通过按位和数字掩盖较高的半字节0x0F:

a b c d w x y z
              &
0 0 0 0 1 1 1 1
---------------
0 0 0 0 w x y z  = lower nibble.
Run Code Online (Sandbox Code Playgroud)

为了提取更高的半字节,我们首先通过按位和0xF0as来屏蔽低半字节:

a b c d w x y z
              &
1 1 1 1 0 0 0 0
---------------
a b c d 0 0 0 0
Run Code Online (Sandbox Code Playgroud)

然后我们按位右移右移4次以消除尾随零.

按位右移一个变量1次会使它松开最右边的位并使最左边的位为零:

a b c d w x y z 
           >> 1
----------------
0 a b c d w x y
Run Code Online (Sandbox Code Playgroud)

类似地,按位右移位2时间将导致结果:

a b c d w x y z 
           >> 2
----------------
0 0 a b c d w x
Run Code Online (Sandbox Code Playgroud)

和按位右移4时间给出:

a b c d w x y z 
           >> 4
----------------
0 0 0 0 a b c d 
Run Code Online (Sandbox Code Playgroud)

清楚地看到结果是byte(abcd)的高半字节.

  • 你的下限和上限应该颠倒过来。二进制从右向左读取。`ASCII:A = DEC:65 = HEX:41`,而不是 `HEX:14` (2认同)