Base64 несовместим с 7-битным кодированием GSM?

Так как я не могу сжать 256-байтовую строку длиной в формате md5 в пределах 160 символов, я решил использовать сообщение Multi-part на Android для разделения SMS на несколько частей, и получатель будет слушать SMS, а затем объединить эти сообщения.

Я использую комбинационный алгоритм отсюда: Android - получение длинного SMS (multipart)

И после нескольких тестов я обнаружил, что отправленное мной SMS было полностью запутано, хотя я закодировал их с Base64 перед отправкой.

Мышление SMS - это 7-битный метод кодирования. Я думал, что это может быть проблема с кодировкой.

Но я успешно отправил сообщение с кодировкой Base 64, но оно было коротким и в пределах 1 SMS.

Мой вопрос:

Если это проблема с кодировкой, то почему я могу отправлять полностью читаемые кодированные в Base64 сообщения в 160 символов, но не могу получить читаемый результат при отправке сообщений, превышающих 160 символов?

Я добавил код здесь: Строка, которую я намереваюсь отправить:

static final String bigNum = "C196BA05AC29E1F9C3C72D56DFFC6154A033F1477AC88EC37F09BE6C5BB95F51C296DD20D1A28A067CCC4D4316A4BD1DCA55ED1066D438C35AEBAABF57E7DAE428782A95ECA1C143DB701FD48533A3C18F0FE23557EA7AE619ECACC7E0B51652A8776D02A425567DED36EABD90CA33A1E8D988F0BBB92D02D1D20290113BB562CE1FC856EEB7CDD92D33EEA6F410859B179E7E789A8F75F645FAE2E136D252BFFAFF89528945C1ABE705A38DBC2D364AADE99BE0D0AAD82E5320121496DC65B3930E38047294FF877831A16D5228418DE8AB275D7D75651CEFED65F78AFC3EA7FE4D79B35F62A0402A1117599ADAC7B269A59F353CF450E6982D3B1702D9CA83";

Код

private void sendMsg (String phoneNum, String msg) {
    SmsManager sms = SmsManager.getDefault();
    ArrayList<String> parts = sms.divideMessage(msg);
    sms.sendMultipartTextMessage(phoneNum, null, parts, null, null);
}

public void onStart() {
    super.onStart();
    final String bigNum64 = Base64.encodeToString(bigNum.getBytes(), 0);
    button.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            sendMsg("5554", bigNum64);
            textView.setText(bigNum64);
        }
    });
}

public void onResume() {
    super.onResume();
    Bundle receiver = getIntent().getExtras();
    if (receiver != null) {
        String msg = receiver.getString("SMS");
        textView.setText("Received" + msg);
    }
}
}

Приемник SMS:

public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    Bundle bundle = intent.getExtras();
    Object[] pdus = (Object[]) bundle.get("pdus");
    SmsMessage[] messages = new SmsMessage[pdus.length];
    String body = "";
    for (int i = 0; i < pdus.length; i++) {
        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
    }
    SmsMessage sms = messages[0];
    try {
        if (messages.length == 1 || sms.isReplace()) {
            body = sms.getDisplayMessageBody();

        }
        else {
            StringBuilder bodyText = new StringBuilder();
            for (int i = 0; i < messages.length; i++) {
                bodyText.append(messages[i].getMessageBody());
            }
            body = bodyText.toString();
        }
    }
    catch (Exception e) {

    }
    Intent start = new Intent(context, SendLongSMSActivity.class);
    start.putExtra("SMS", body);
    start.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(start);
}

Спасибо за вашу помощь!

Связанное сообщение: Любой способ сжать 256 байтов "MD5-like" строка в 160 байт или меньше?

Даже если я даю довольно простую длинную строку, например

"0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"

и независимо от кодировки Base64 или без него приемник не может получить правильные результаты.

ОБНОВЛЕНИЕ # 2

При использовании реального телефона для тестирования приемник может получать правильное сообщение без базы 64, из-за эмулятор исказил текст.

Вопрос закрыт.

Спасибо всем, кто помогает! И спасибо @Dan

UPDATE:

Строка "0123456789ABCDEF..." без base64, разделенная на 2 части:

part [0]    "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF012345678" 

part [1]    "9ABCDEF0123456789ABCDEF"   

Здесь разделенная base64 строка "0123456789ABCDEF...:

part[0] "MDEyMzQ1Njc4OUFCQ0RFRjAxMjM0NTY3ODlBQkNERUYwMTIzNDU2Nzg5QUJDREVGMDEyMzQ1Njc4\nOUFCQ0RFRjAxMjM0NTY3ODlBQkNERUYwMTIzNDU2Nzg5QUJDREVGMDEyMzQ1Njc4OUFCQ0RFRjAx"    

part[1] "\nMjM0NTY3ODlBQkNERUYwMTIzNDU2Nzg5QUJDREVGMDEyMzQ1Njc4OUFCQ0RFRjAxMjM0NTY3ODlB\nQkNERUY=\n"    
2
03 авг. '11 в 2:42
источник поделиться
1 ответ

Похоже, что разделитель sms добавляет \n символов после каждых 77 символов и в конце просто удаляет их из вашей строки и будет правильно декодировать.

0
03 авг. '11 в 19:50
источник

Посмотрите другие вопросы по меткам или Задайте вопрос