简体   繁体   中英

Convert char array to structs array in c

I have an unsigned char* (bytes sent from the server) that I need to convert/cast to an array of structs whose size exactly matches that of the unsigned char*. Without copying values , how do I achieve this? In the uchar*, there could be any number of structs.

How do I achieve this?

I have tried the following (psuedo code):

// Define the struct:
struct MyStruct:
    unsigned char name[6]
    long time
    double speed

// ...some code...

// Get the uchar*.
unsigned char* chars = getUchars()

// The uchar*'s first byte is a special flag,
// so the structs start at index 1 not 0.
unsigned char* chars2 = &chars[1]

// Convert chars2 to an array of MyStructs.
MyStruct *structs = (MyStruct*) chars2

// Get the first struct and print values.
MyStruct s1 = structs[0]
_print(charArrayToString(s1.name), s1.time, s1.speed)
// When this _print() is called, the struct's
// name value is printed correctly, but its time
// and speed are not printed correctly.

// Get the second struct.
MyStruct s2 = structs[1]
_print(charArrayToString(s2.name), s2.time, s2.speed)
// None of this second struct's name, time and speed
// is printed correctly.

Where did I make mistakes?

use pragma pack, it works in most compilers

#include <stdio.h>

struct DefaultPack
{
    char str[6];
    long time;
    double speed;
};

#pragma pack(push,1)
struct Packed
{
    char str[6];
    long time;
    double speed;
};
#pragma pack(pop)


int main (int argc, char *argv[])
{
    struct DefaultPack n;
    struct Packed p;
    printf("Sizes of struct:\n"
           "Default packing: %lu\n"
           "Packed: %lu\n"
           "in packed struct:\n"
           "offset of time: %lu\n"
           "offset of speed: %lu\n"
           "in default packed struct:\n"
           "offset of time: %lu\n"
           "offset of speed: %lu\n",
           sizeof(struct DefaultPack),
           sizeof(struct Packed),
           (void*)&p.time  - (void*)&p.str[0],
           (void*)&p.speed - (void*)&p.str[0],
           (void*)&n.time  - (void*)&n.str[0],
           (void*)&n.speed - (void*)&n.str[0]
           );
    return(0);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM