#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> //1:3:5:7:8:20:28:40 //80080800D5 //213,0,8,8,128,0,0,0 //#define ZXIC #ifdef ZXIC #define BAND_WIDTH 8 #else #define BAND_WIDTH 4 #endif int str_reverse(char *str) { int i, j; char c; if (NULL == str || (j = strlen(str)) == 0) return -1; for (i = 0, j--; i < j; i++, j--) { c = str[i]; str[i] = str[j]; str[j] = c; } return 0; } void get_band_value(int band, int *offset, int *value) { int temp; *offset = band / BAND_WIDTH; temp = band % BAND_WIDTH; if (temp == 0) { (*offset)--; #ifdef ZXIC temp = BAND_WIDTH; #else temp = 2 * BAND_WIDTH; #endif } #ifdef ZXIC *value = pow(2, temp - 1); #else if (temp == BAND_WIDTH - 1) { temp = BAND_WIDTH; } *value = temp; #endif } int get_frequency_bands(char *band, char *bandBuf) { int bandValue, offset, value; char *ptr = NULL, temp[64] = {0}; #ifdef ZXIC int i, tempBuf[9] = {0}; #endif if (NULL == band || NULL == bandBuf || strlen(band) == 0) return -1; memcpy(temp, band, strlen(band)); if ((ptr = strtok(temp, ":")) == NULL) { ptr = temp; } do { if ((bandValue = atoi(ptr)) <= 0) return -1; get_band_value(bandValue, &offset, &value); #ifdef ZXIC tempBuf[offset] += value; #else bandBuf[offset] += value; if (bandBuf[offset] > '9') { bandBuf[offset] += ('A' - '9' - 1); } #endif ptr = strtok(NULL, ":"); } while (ptr); #ifdef ZXIC offset = 0; for (i = 0; i < BAND_WIDTH; i++) { offset += sprintf(&bandBuf[offset], "%d,", tempBuf[i]); } bandBuf[--offset] = '\0'; #else bandBuf[++offset] = '\0'; #endif #ifdef ZXIC return 0; #else return str_reverse(bandBuf); #endif } int main(int argc, char *argv[]) { char band[32] = "00000000000000000000"; get_frequency_bands("1:3:5:7:8:20:28:40", band); printf("band:%s\n", band); return 0; }