2016-03-19 32 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