Отравляю команду что бы проверить баланс в ответ получаю такое: AT+CUSD=1,"#100#" OK +CUSD: 0,"041204400435043C044F0020043E0436043804340430043D0438044F0020043E0442043204350442043000200438044104420435043A043B043E002E0020041F043E043F0440043E043104430439044204350020043F043E043704360435002E",72 . Что это и как получить нормально данные? Оператор мегафон
Так бывает, когда СМС передается в UCS2 по причине наличия в ней кириллицы. Каждые 4 шестнадцатеричные цифры - кодируют один символ. Надо перекодировать данную последовательность из UCS2, представленного в HEX, в нормальные символы. UCS2 - по сути подмножество Unicode UTF-16. Я использовал такую функцию для преобразования в utf-8 (chartohex - вспомогательный довесок) Код (C): String decodeUTCString(String &S){ String result=""; unsigned char c[4]=""; for (int i=0;i<S.length()-3;i+=4){ wchar_t codepoint=(((unsigned int)chartohex(S[i]))<<12)+ (((unsigned int)chartohex(S[i+1]))<<8)+ (((unsigned int)chartohex(S[i+2]))<<4)+ ((unsigned int)chartohex(S[i+3])); if (codepoint <= 0x7F) { c[0] = (char)codepoint; c[1] = 0; result+=String((char*)c); } else if (codepoint <= 0x7FF) { c[0] = (char)(0xC0 | (codepoint >> 6)); c[1] = (char)(0x80 | (codepoint & 0x3F)); c[2] = 0; result+=String((char*)c); } else if (codepoint <= 0xFFFF) { c[0] = (char)(0xE0 | (codepoint >> 12)); result+=String((char*)c); c[1] = (char)(0x80 | ((codepoint >> 6) & 0x3F)); result+=String((char*)c); c[2] = (char)(0x80 | (codepoint & 0x3F)); c[3] = 0; result+=String((char*)c); } } return(result); } unsigned char chartohex(char c){ if ((c>=0x30)&&(c<=0x39)) return (c-0x30); else if ((c>='A')&&(c<='F')) return (c-'A'+10); else return(0); } Соответственно, нужна функция, которая будет аналогичным образом переводить из USC2 в требуемую кодировку. А мегафон, кстати, отвечает "Время ожидания ответа истекло. Попробуйте позже. "