2012-12-27 5 views
0

J'ai un octet bJava octet d'analyse syntaxique

octet a 8 bits

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 

comment pourrais-je parse bits 3 et 4?

Répondre

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

bitwise AND (&)

Exemple:

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

pouvez-vous démontrer dans un petit extrait. Merci beaucoup – stackoverflow

+0

Je l'ai déjà fait. Je ne vais pas faire votre code pour vous. Je vous en prie. – SJuan76

2

Vous pouvez utiliser BitSet classe pour récupérer des bits spécifiques à partir d'une valeur d'octet:

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; 
} 

En utilisant la méthode ci-dessus, vous pouvez obtenir la représentation BitSet de votre octet et obtenir des bits spécifiques:

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

essayer

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

Pouvez-vous expliquer ce que le bit eting fait ici et pourquoi nous l'anding par 0xC. Merci – stackoverflow

+1

octet complet peut être 0b11001100 ou 0b01001100 ou autre, mais après & 0xC il devient 0b00001100, seuls les bits 3 et 4 sont à gauche, et nous pouvons maintenant analyser notre octet en le comparant avec 0000 1000 0100 0000 –

+0

Réponse très utile. Je vous remercie! – stackoverflow

1

Si je vous ai droit, vous voulez que les bits b[3] et b[4] être analysé comme ceci:

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

Je ferais ceci:

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

en JBBP il ressemble

@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);