tags:

views:

327

answers:

2

Hi

I am using ms c++. I am using struct like

    struct header   {
        unsigned port : 16;
                unsigned destport : 16;
        unsigned not_used : 7;
        unsigned packet_length : 9;


    };
struct header HR;

here this value of header i need to put in separate char array.

i did memcpy(&REQUEST[0], &HR, sizeof(HR));

but value of packet_length is not appearing properly.

like if i am assigning HR.packet_length = 31; i am getting -128(at fifth byte) and 15(at sixth byte).

if you can help me with this or if their is more elegant way to do this.

thanks

+2  A: 

Sounds like the expected behaviour with your struct as you defined packet_length to be 9 bits long. So the lowest bit of its value is already within the fifth byte of the memory. Thus the value -128 you see there (as the highest bit of 1 in a signed char is interpreted as a negative value), and the value 15 is what is left in the 6th byte.

The memory bits look like this (in reverse order, i.e. higher to lower bits):

     byte 6    |     byte 5    | ...
0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 
 packet_length   |   not_used  | ...

Note also that this approach may not be portable, as the byte order inside multibyte variables is platform dependent (see endianness).

Update: I am not an expert in cross-platform development, neither did you tell much details about the layout of your request etc. Anyway, in this situation I would try to set the fields of the request individually instead of memcopying the struct into it. That way I could at least control the exact values of each individual field.

Péter Török
but i dont know how to solve this problem,
changed
@changed see my update, hope it helps :-)
Péter Török
+1  A: 
struct header   {
  unsigned port : 16;
  unsigned destport : 16;
  unsigned not_used : 7;
  unsigned packet_length : 9;
};

int main(){
  struct header HR = {.packet_length = 31};
  printf("%u\n", HR.packet_length);
}

$ gcc new.c && ./a.out
31


Update:

i now that i can print that value directly by using attribute in struct. But i need to send this struct on network and their i am using java.

In that case, use an array of chars (length 16+16+7+9) and parse on the other side using java.
Size of array will be less than struct, and more packing could be possible in a single MTU.

N 1.1
yes, i now that i can print that value directly by using attribute in struct.But i need to send this struct on network and their i am using java.As i cant have this struct in Java i am facing the problem as explained by "Peter Torok".
changed
@changed: answer updated.
N 1.1