开发者

c/c++ how to convert short to char

开发者 https://www.devze.com 2022-12-23 09:12 出处:网络
I am using ms c++. I am using struct like struct header{ unsigned port : 16; unsigned destport : 16; unsigned not_used : 7;

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

    struct header   {
        unsigned port : 16;
                unsigned destport : 16;
        unsigned not_used : 7;
  开发者_StackOverflow中文版      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


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.


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消