簡體   English   中英

讀取Java中32位無符號整數的位值

[英]Read value of bits in a 32bit unsigned integer in Java

我試圖在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&ed = 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

我不會把它當作一個int可言。 原因是您的數據以字節形式出現,您將其轉換為int ,然后將int解碼為字節。

我會在你得到它時解析每個字節。 但是在回答你的問題時,我會使用Integer.toHexString(status)int值打印為十六進制,以確保你的int按照你的預期組成。 你的18作為一個int值似乎是錯誤的,所以試圖把它變成位將不會使它更正確。

我要檢查的第一件事是你沒有這樣做。

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

這將返回一個int值,但它是一個8位的int值,而不是32位的int值。

事實證明,硬件設備api上的方法只返回長度並解析其中一個參數返回了我需要的所有細節。 所以

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

在給出正確的int時工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM