ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-将位转换为整数

2019-10-12 19:02:44  阅读:244  来源: 互联网

标签:java bytearray endianness


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

这是一个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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有