我试图在Java中读取Integer中的位值。我正在读取硬件设备的状态,说明它返回:
标题(4个字节): 1B + FF + 02 + m 其中m是m之后的状态数据的字节数。字节3应该定义状态包的类型。
状态摘要(4个字节): 状态摘要的32位中的每一位都可用作以下用途的标志,请注意,这是一个32位无符号整数。每个位(0-31)大多为0或1。
当我从USB设备读取状态时,它通常返回“18”。所以我尝试了这样的功能:
status_printer_error = getBit(status,0);
public int getBit(int n, int k) {
return (n >> k) & 1;
}
这似乎不起作用。我也试过循环遍历所有位:
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&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCkQFjAA&url=http%3A%2F%2Fwww.hengstler.com%2Fgfx%2Ffile%2Fshop%2Fprinter%2FeXtendo_X-80%2FD-684-112_EmulationCommandSetReference_eXtendo-E-V1_07.pdf&ei=8BaeUuLII5H3oASAxoLQDw&usg=AFQjCNF6iwxBwDsotnKUYmeWwis6ZIqX2w&bvm=bv.57155469,d.cGU
答案 0 :(得分:2)
我根本不会将其视为int
。原因是您的数据以字节形式出现,您将其转换为int
,然后将int
解码回字节。
我会在你得到它时解析每个字节。但是在回答您的问题时,我会将int
值打印为带Integer.toHexString(status)
的十六进制,以确保您的int
按照您的预期编写。您的18
作为int值似乎是错误的,因此尝试将其转换为位将不会使其更正确。
我要检查的第一件事是你没有这样做。
int i = inputStream.read(); // is 8-bit not 32-bit.
返回int
值,但它是一个8位的int值,而不是32位的int值。
答案 1 :(得分:0)
事实证明,硬件设备api上的方法只返回长度并解析其中一个参数返回了我需要的所有细节。所以
public int getBit(int n, int k) {
return (n >> k) & 1;
}
在给出正确的int时工作。