2016-03-19 30 views
0

我试图打包和解包的GPS坐标转换成字符缓冲区:C:如何做结构打包和解压缩到char缓冲区?

我有一个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

搜索“序列化”并使用与实现无关的类型的bitshifts/bitops。不要只是'memcpy'数据。请注意,对于GPS,您可能拥有NEMA,这是一种ASCII格式。 – Olaf

+0

你确定要无条件递归你的功能吗?无限下降通常不是一个好主意。 – EOF

回答

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位。
+0

为什么缓冲区[]有10个插槽? – Iona

+0

@Iona:因为需要10个字节来存储2个字符和4个16位整数。 – chqrlie

+0

因此对于纬度-51.533,我希望它coord.north = 0; coord.lat = 51;和coord.lat_frac = 553; – Iona