在 Java 中读取 32 位无符号整数中的位值

Read value of bits in a 32bit unsigned integer in Java

我正在尝试在 Java 中读取 Integer 中的位值。我正在读取一个硬件设备的状态,它说它返回:

标头(4 字节):
1B FF 02 米
其中 m 是 m 之后的状态数据的字节数。字节 3 应该定义状态包的类型。

状态摘要(4 字节):
状态摘要的 32 位中的每一位都可用作标志,用于以下目的,请注意,这是一个 32 位无符号整数。每个位 (0-31) 大多为 0 或 1。

当我从 USB 设备读取状态时,它通常返回"18"。所以我尝试了这样的功能:

1
2
3
4
status_printer_error = getBit(status,0);
public int getBit(int n, int k) {
    return (n >> k) & 1;
}

但这似乎不起作用。我还尝试循环遍历所有位:

1
2
3
4
for (int i = 31; i >= 0; i--) {
            int s = status_sum & (1 << i);
            Log.d(TAG,"bit:" + s);
        }

但结果似乎错误,我得到 0,2,0,0,16,0,0...等(全为 0)。

这是设备的 PDF 文档。打印功能都对我有用,这只是我正在努力解决的状态部分(第 51 页):
https://www.google.com/url?sa=t


我根本不会把它当作一个int。原因是您的数据以字节形式出现,您将其转换为 int 然后将 int 解码回字节。

我会在你得到它时解析每个字节。但在回答您的问题时,我会将 int 值打印为带有 Integer.toHexString(status) 的十六进制值,以确保您的 int 组成如您所愿。您的 18 作为 int 值似乎是错误的,因此尝试将其转换为位不会使其更正确。

我要检查的第一件事是你没有这样做。

1
int i = inputStream.read(); // is 8-bit not 32-bit.

这将返回一个 int 值,但它是一个 8 位 int 值,而不是 32 位 int 值。


所以事实证明,硬件设备 api 上的方法只返回长度,解析其中一个参数返回了我需要的所有细节。所以

1
2
3
public int getBit(int n, int k) {
    return (n >> k) & 1;
}

在给出正确的 int 时起作用。