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



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

我的应用程序发送数组:

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

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

[0,1,2,3,4]

我尝试过用许多编码作为文本发送,但它不起作用。

我在模拟器和设备上尝试过,结果都是一样的。

我试着用可打印字符(字母、数字)发送字节,效果很好,所以我我认为问题是无法打印字节,但我需要通过短信发送字节……一个朋友做了这样的东西,但使用黑莓,效果很好。

我做错了什么?

这是发送的代码:

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());
        }
    }
}
}

提前感谢:)

如果您从根本上试图通过基于文本的接口发送任意字节,那么最安全的方法是使用base-64。安卓系统中有一个Base64类,这使得这非常容易。

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

请确保在关闭流之前先冲洗它们。看起来你不是在处理流。那么我猜一些长度参数是错误的。

如果你想要加密,为什么不发送一个加密的字符串呢?无需尝试字节。检查此片段:http://www.androidsnippets.com/encryptdecrypt-strings

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

最新更新