2017-05-31 3 views
0

J'ai un flux de données de 4 octets, je sais à quelle morsure je voulais les séparer et les affecter à une variable différente. en gardant à l'esprit les données que je reçois est en format hexadécimal. disons,comment puis-je déchiffrer les données de 4 octets les diviser en conséquence et les affecter à une variable significative?

P_settings 4bytes p_timeout [6:0] 
        p_s_detected[7] 

        p_o_timeout [14:8] 
        p_o_timeout_set [15] 

        override_l_lvl [23:16] 
        l_b_lvl [31:24] 

ci-dessus P_settings est de 4 octets et je voulais les diviser en petits morceaux comme octet p_timeout [6:0] requires 7 bits of those 4 byte.

Actuellement, la mise en œuvre, je l'ai essayé is..for juste un octet divisé en petits morceaux.

var soch = ((b_data>> 0)& 0x7F); if i want first 7 bits 

comment dois-je faire pour 4 octets flux

+0

Avez-vous pensé à utiliser un uint? C'est 32 bits. Généralement, si les bits que vous voulez sont divisés sur des octets différents dans une valeur de 4 octets, vous n'avez pas à vous soucier du fait qu'ils sont dans des octets séparés. c'est-à-dire le résultat d'octet = ((b_data & 0x000ff000) >> 12) retirerait les bits 12 - 20. –

Répondre

2

code Essayez comme ça. Vous avez dit que l'entrée était un flux.

public class P_Settings 
    { 
     byte p_timeout; //[6:0] 
     Boolean p_s_detected; //[7] 

     byte p_o_timeout; // [14:8] 
     Boolean p_o_timeout_set; // [15] 

     byte override_l_lvl; //[23:16] 
     byte l_b_lvl; //[31:24] 

     public P_Settings(Stream data) 
     { 
      byte input = (byte)(data.ReadByte() & 0xff); 
      p_timeout = (byte)(input & 0x7F); 
      p_s_detected = (input & 0x80) == 0 ? false : true; 

      input = (byte)(data.ReadByte() & 0xff); 
      p_o_timeout = (byte)(input & 0x7F); 
      p_o_timeout_set = (input & 0x80) == 0 ? false : true; 

      override_l_lvl = (byte)(data.ReadByte() & 0xff); 
      l_b_lvl = (byte)(data.ReadByte() & 0xff); 
     } 
    } 
-1

SO, il se révèle beaucoup plus facile que je pensais .. 1) les séparer par un seul octet et les mettre dans un tampon et & fonctionnent individuellement et vous obtiendrez les données. merci pour tout le soutien.

**

   byte input = (byte)(buffer[10]);//1 byte 
       var p_timeout = (byte)(input & 0x7F); 
       var p_s_detected = (input & 0x80) == 0 ? false : true; 

       input = (byte)(buffer[11]);//1 byte 
       var p_o_timeout = (byte)(input & 0x7F); 
       var p_o_timeout_set = (input & 0x80) == 0 ? false : true; 

       var override_l_lvl = (byte)(buffer[12] & 0xff);//1 byte 
       var l_b_lvl = (byte)(buffer[13] & 0xff); //1 byte 

**

+0

Eh bien, c'est presque un copier-coller exact de la bonne réponse de jdweng ... – Herb