C:如何将struct打包和解压缩到char缓冲区?

时间:2016-03-19 16:33:38

标签: c char buffer datagram packing

我正在尝试将gps坐标打包并解压缩到字符缓冲区中:

我有一个gpscoords结构:

typedef struct {
    char north;
    uint16_t lat;
    uint16_t lat_frac;
    char east;
    uint16_t lon;
    uint16_t lon_frac;
} gpscoords;

如何将gpscoords打包并解压缩到缓冲区变量指向的缓冲区?我希望在打包之前将整数转换为网络顺序,但我在下面做错了:

void pack_gpscoords(gpscoords *pos, char *buffer) {
    pack_gpscoords(pos, &buffer);
    memcpy(buffer, pos, sizeof(pos)+1);
}

void unpack_gpscoords(gpscoords *pos, char *buffer) {
    unpack_gpscoords(pos, &buffer);
    memcpy(pos, buffer, sizeof(buffer)+1);
}

1 个答案:

答案 0 :(得分:2)

您应该使用字节缓冲区unsigned char而不是char

以下是如何执行此操作的方法:

void pack_gpscoords(gpscoords *pos, unsigned char *buffer) {
    buffer[0] = pos->north;
    buffer[1] = pos->lat >> 8;
    buffer[2] = pos->lat & 255;
    buffer[3] = pps->lat_frac >> 8;
    buffer[4] = pps->lat_frac & 255;
    buffer[5] = pos->east;
    buffer[6] = pos->lon >> 8;
    buffer[7] = pos->lon & 255;
    buffer[8] = pps->lon_frac >> 8;
    buffer[9] = pps->lon_frac & 255;
}

void unpack_gpscoords(gpscoords *pos, const unsigned char *buffer) {
    pos->north = buffer[0];
    pos->lat = (buffer[1] << 8) | buffer[2];
    pos->lat_frac = (buffer[3] << 8) | buffer[4];
    pos->east = buffer[5];
    pos->lon = (buffer[6] << 8) | buffer[7];
    pos->lon_frac = (buffer[8] << 8) | buffer[9];
}

注意:

  • 面向字节的打包表示采用相同的字段顺序。
  • 网络顺序表示big-endian:第一个字节包含高位8位,第二个字节包含低位8位。