在android中发送非打印字符二进制短信

时间:2013-12-13 06:42:18

标签: java android encoding sms

我正在开发一个加密的短信应用程序,我正在加密到3DES的短信我试图使用SmsManager.sendDataMessage将字节数组结果发送到另一部手机,但我无法在接收器中读取正确的字节数组电话,例如:

我的应用发送数组:

[0,1,2,3,4,5,6,7,-100,-101,-105,-110]

而在另一部手机中,我只收到(如果幸运的话)

[0,1,2,3,4]

我尝试使用多种编码发送文本,但它无效。

我在模拟器和设备上试过它,行为是一样的。

我尝试从可打印字符(字母,数字)发送字节,它完美无缺,所以我 认为问题是非打印字节,但我需要通过sms发送字节....一个朋友做了类似的东西,但使用黑莓,它工作正常。

我做错了什么?

这是发送代码:

SmsManager manager = SmsManager.getDefault();
byte[] arrBytes = new byte[]{0,1,2,3,4,5,6,7,-100,-101,-105,-110};

manager.sendDataMessage(number, null, (short)0, arrBytes, null, null);

这是接收代码:

public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){
    Bundle bundle = intent.getExtras();
    SmsMessage[] smsMensajes = null;
    if(bundle != null){
        try{
            Object[] pdus = (Object[]) bundle.get("pdus");
            smsMensajes = new SmsMessage[pdus.length];
            byte[] msjByte = new byte[100];

            for(int i=0; i < smsMensajes.length; i++){
                smsMensajes[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
                msjByte = smsMensajes[i].getUserData();
            }

        }
        catch(Exception e){
            Log.e("Recibiendo SMS", e.toString());
        }
    }
}
}

提前致谢:)

2 个答案:

答案 0 :(得分:2)

如果您从根本上尝试通过基于文本的界面发送任意字节,最安全的方法是使用base-64。 Android中有一个Base64类,这非常容易。

不可否认,这意味着大小有点膨胀,所以在140个字符中你只能传输105个字节,但至少它是安全的,应该与任何设备和API一起使用。

答案 1 :(得分:-1)

确保在关闭流之前刷新流。看起来你不是在使用溪流。然后我猜一些长度的参数是错误的。

如果您正在加密,那么为什么不发送加密字符串?无需尝试字节。请查看以下代码段:http://www.androidsnippets.com/encryptdecrypt-strings

出于好奇:你如何在两端管理加密/解密的密钥?