2013-01-03 3 views
5

ASCII stringTBCD(Telephony Binary-Coded Decimal) 형식으로 변환하고 C에서 그 반대의 경우도 있습니다. 여러 사이트에서 검색했지만 내 대답을 찾을 수 없습니다.ASCII에서 TBCD 로의 변환

답변

5

가장 쉬운 방법은 배열 쌍을 사용하여 각 ASCII 문자를 해당 TBCD에 매핑하는 것입니다. 그 반대. 당신이 사용해야 what I read on Wikipedia에서

은 다음과 : 당신은 TBCD이있는 경우

const char *tbcd_to_ascii = "*#abc"; 
const char ascii_to_tbcd[] = { 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0,11, 0, 0, 0, 0, 0, 0,10, 0, 0, 0, 0, 0, /* # * */ 
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0 /* digits */ 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0,12,13,14   /* a b c */ 
}; 

, 당신은 할 것 ASCII로 변환 :

/* The TBCD to convert */ 
int tbcd[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }; 
/* The converted ASCII string will be stored here. Make sure to have enough room for the result */ 
char ascii[16]; 
/* Convert the TBCD to ASCII */ 
int i; 
for (i = 0; i < sizeof(tbcd)/sizeof(*tbcd); i++) 
    ascii[i] = tbcd_to_ascii[tbcd[i]]; 
/* For safety, null terminate the ASCII string */ 
ascii[i] = 0; 

을 TBCD에 ASCII로 변환하는 것은 매우 유사하다 :

for (i = 0; ascii[i]; i++) 
    tbcd[i] = ascii_to_tbcd[ascii[i]]; 
+0

T 그는 BCD에 대한 C 구현을 다음과 같이 제공합니다. http://en.wikipedia.org/wiki/Double_dabble –

+0

@kmkaplan TBCD 형식의 IMSI를 ASCII로 변환한다고 가정합니다. 배열이 어떻게 도움이 될까요? –

+0

@DJ IMSI가 무엇인지는 모르지만 TBCD 배열을 ASCII 문자열로 변환하는 방법을 보여주기 위해 내 대답을 편집했습니다. – kmkaplan

2
#include <ctype.h> 
int cnv_tbcd(char *str, char *tbcd) { 
    int c = 0; 
    int err = 0; 
    for (c=0; str[c]; c++) { 
    if (isdigit(str[c])) { 
     tbcd[c] = str[c] & 0x0f; 
    } else { 
     switch(str[c]) { 
     case '*': tbcd[c] = 0x0a; break; 
     case '#': tbcd[c] = 0x0b; break; 
     case 'a': tbcd[c] = 0x0c; break; 
     case 'b': tbcd[c] = 0x0d; break; 
     case 'c': tbcd[c] = 0x0e; break; 
     default: tbcd[c] = 0xff; err++; 
     } 
    } 
    } 
    if (c % 2 == 0) { 
    tbcd[c] = 0x0f; 
    tbcd[c+1] = 0; 
    } 
    return err; 
} 
+0

예, 답변을 업데이트했습니다. – perreal