2012-12-27 105 views
0

我有一个BYTE B的Java字节解析

字节有8位

bits for single byte 

0 = status 
1 = locale 
2 = AUX 
bits (3 & 4) relay 
1. 0 (hence 00) still 
2. 1 (hence 01) noStill 
3. 2 (hence 10) stationed 
4. 3 (hence 11) slow 
5 = message; 
6 = stuff 
7 = moreStuff 

我将如何解析位3和4?

回答

1
switch ((b>>3)&3){ 
    case 0: return still; 
    case 1: return noStill; 
    case 2: return stationed; 
    case 3: return slow 
} 
1

bitwise AND&

实施例:

myByte & 0x08 --> myByte & 00001000 --> 0 if and only if bit 4 of "myByte" is 0; 0x08 otherwise 
+0

你可以在一个小的片段中演示。非常感谢 – stackoverflow

+0

我已经做到了。我不打算为你做你的代码。不用谢。 – SJuan76

2

可以使用BitSet类从一个字节值检索特定的位:

public static BitSet fromByte(byte b) 
{ 
    BitSet bits = new BitSet(8); 
    for (int i = 0; i < 8; i++) 
    { 
     bits.set(i, (b & 1) == 1); 
     b >>= 1; 
    } 
    return bits; 
} 

通过使用上面的方法,可以获得您的字节的BitSet表示并获取特定位:

byte b = ...; // byte value. 
System.out.println(fromByte(b).get(2)); // printing bit #3 
System.out.println(fromByte(b).get(3)); // printing bit #4 
2

尝试

boolean still = (b & 0xC) == 0x0; 
    boolean noStill = (b & 0xC) == 0x4; 
    boolean stationed = (b & 0xC) == 0x8; 
    boolean slow = (b & 0xC) == 0xC; 
+0

你能解释一下在这里做什么,以及为什么我们用0xC来做这件事。谢谢 – stackoverflow

+1

完整字节可能是0b11001100或0b01001100或其他,但在&0xC之后它变成0b00001100,只留下第3和4位,现在我们可以通过将它与0000 1000 0100 0000 –

+0

进行比较来分析我们的字节。谢谢! – stackoverflow

1

如果我得到你的权利,你想在b[3]b[4]位要分析是这样的:

00 = still 
01 = noStill 
10 = stationed 
11 = slow 

我应该这样做:

if(b[3] == 0) { // still or noStill 
    if(b[4] == 0) {/* still */} 
    if(b[4] == 1) {/* noStill */} 
} 
if(b[3] == 1) { // stationed or slow 
    if(b[4] == 0) {/* stationed */} 
    if(b[4] == 1) {/* slow */} 
} 
0

in JBBP它看起来像

@Bin(type = BinType.BIT) class Parsed { byte status; byte locale; byte aux; byte relay; byte message; byte stuff; byte moreStuff;} 
final Parsed parsed = JBBPParser.prepare("bit status; bit locale; bit aux; bit:2 relay; bit message; bit stuff; bit moreStuff;").parse(new byte[]{12}).mapTo(Parsed.class);