编程语言
首页 > 编程语言> > java-将位转换为整数

java-将位转换为整数

作者:互联网

我收到一个包含字节数组的数据包,我必须从中获取一些整数值.
这是文档的一部分.有人能帮助我吗?

这是一个4字节数组.

Year from 1990 to 2052 (6 bit), Month from 1 to 12 (4 bit), Day from 1
to 31 (5 bit), Hour from 0 to 23 (5 bit), Minute from 0 to 59 (6 bit),
Second from 0 to 59 (6 bit) Default value: 1 January 2000, 12:00:00

消息的格式为小端.

解决方法:

您需要执行一些按位操作.首先,从字节中构造一个int:

int n = b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);

然后,将int切成组件.现在,您的问题没有指定字段从右到左或从左到右的方向.这个问题与字节序有关,但不完全相同.因此,我们假设字段从左到右.

良好的意识表明从左到右.这样,就可以比较时间值的整数表示形式-年位的重要性大于月位等,因此,当您比较对应于两个时间点的整数时,您将获得按时间顺序排列的正确结果.

这是给您的心理印象.这是一个整数变量,由位组成:

f e d c b a 9 8 7 6 5 4 3 2 1 0
            -----
              offset is 6, length is 3

让我们定义一个函数,该函数以给定的偏移量(以位为单位)以给定的长度(以位为单位)从int中获取任意块.

int bits(int n, int offset, int length)
{
    //shift the bits rightward, so that the desired chunk is at the right end
    n = n >> (31 - offset - length); 

    //prepare a mask where only the rightmost `length`  bits are 1's
    int mask = ~(-1 << length);

    //zero out all bits but the right chunk
    return n & mask;
}

本来可以是单线的,但我想使它具有启发性.下面的答案中的人通过为每个块手动指定移位因子和掩码来有效地内联此功能.

现在让我们分解.假设n来自最上面的代码段:

int year  = bits(n, 0,  6),
    month = bits(n, 6,  4),
    day   = bits(n, 10, 5),
    hour  = bits(n, 15, 5),
    min   = bits(n, 20, 6),
    sec   = bits(n, 26, 6);

我们通过将先前字段的总长度组合在一起来获得偏移的值.这是基于以下假设:字段从左到右;如果它们相反,则偏移值将不同.

那有意义吗?

编辑:如果位块右到leftt,那么这是怎么回事:

int sec   = bits(n, 0,  6),
    min   = bits(n, 6,  6),
    hour  = bits(n, 12, 5),
    day   = bits(n, 17, 5),
    month = bits(n, 22, 4),
    year  = bits(n, 26, 6);

标签:java,bytearray,endianness
来源: https://codeday.me/bug/20191012/1902508.html