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

Java 在android中发送非打印字符二进制短信,java,android,encoding,sms,Java,Android,Encoding,Sms,我正在开发一个加密短信应用程序,我正在将短信加密到3DES,我正在尝试使用SmsManager.sendDataMessage将字节数组结果发送到另一部手机,但我无法读取接收手机中的正确字节数组,例如: 我的应用程序发送阵列: [0,1,2,3,4,5,6,7,-100,-101,-105,-110] 在另一部电话里,我只收到(如果幸运的话) 我已经尝试过用许多编码发送文本,但它不起作用 我在模拟器和设备上试过,结果都是一样的 我尝试从可打印字符(字母、数字)发送字节,它工作得很好,所以我 我

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

我的应用程序发送阵列:

[0,1,2,3,4,5,6,7,-100,-101,-105,-110]
在另一部电话里,我只收到(如果幸运的话)

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

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

我尝试从可打印字符(字母、数字)发送字节,它工作得很好,所以我 我认为问题在于无法打印字节,但我需要通过短信发送字节。。。。一位朋友做了类似的事情,但使用黑莓手机,效果很好

我做错了什么

这是用于发送的代码:

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());
        }
    }
}
}
public void onReceive(上下文、意图){
if(intent.getAction().equals(“android.provider.Telephony.SMS_RECEIVED”)){
Bundle=intent.getExtras();
SmsMessage[]smsMensajes=null;
if(bundle!=null){
试一试{
Object[]pdus=(Object[])bundle.get(“pdus”);
smsMensajes=新SmsMessage[pdus.length];
字节[]msjByte=新字节[100];
对于(int i=0;i

提前感谢:)

请确保在关闭流之前冲洗流。不过,看起来您没有使用streams。那么我猜一些长度参数是错误的

如果您正在加密,为什么不发送加密字符串?不需要尝试字节。检查此代码段:


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

关闭流之前,请确保冲洗流。不过,看起来您没有使用streams。那么我猜一些长度参数是错误的

如果您正在加密,为什么不发送加密字符串?不需要尝试字节。检查此代码段:


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

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


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

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


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

问题中没有流,只有一个字节数组。加密在本地工作得非常好,我将其保存在base64中,密钥,每一端都有一个与另一端共享的密钥问题中没有流-只有一个字节数组。加密在本地工作得很好,我将其保存在base64中,并且密钥,每一端都有一个与另一端共享的密钥我正在尝试以字节方式发送字节,而不是以文本方式,但我不知道为什么,我发送的字节,没有收到。而且,base64是一个选项,但我们正试图避免它,因为它减少了我们可以通过SMS传输的数据长度。我之所以尝试字节,是因为我的朋友用黑莓手机做的,我认为android可以做bb能做的。因为bb必须理解android发送的内容,而android必须理解bb发送的内容,换句话说,sms将从一个设备发送到另一个设备。@oware:问题是,就API而言,sms本质上是一种文本媒体。您不能以“字节方式发送字节”,因为您只能以文本方式与API对话。虽然您可以尝试找到适当的字符来映射每个二进制值,但我认为您很可能会遇到不同平台以微妙不同的方式解码SMS的问题。如果你愿意的话,可以尝试一下,但我坚信base64是最健壮的方式,它会帮你省去很多心痛。好吧,我们最终使用base64对字节进行编码并通过短信发送。。。我会认为你的答案是正确的,因为你提出了这个建议。ThanksI正在尝试以字节方式发送字节,而不是以文本方式,但我不知道为什么,我发送的字节没有被接收。而且,base64是一个选项,但我们正试图避免它,因为它减少了我们可以通过SMS传输的数据长度。我之所以尝试字节,是因为我的朋友用黑莓手机做的,我认为android可以做bb能做的。因为bb必须理解android发送的内容,而android必须理解bb发送的内容,换句话说,sms将从一个设备发送到另一个设备。@oware:问题是,就API而言,sms本质上是一种文本媒体。您不能以“字节方式发送字节”,因为您只能以文本方式与API对话。虽然您可以尝试找到适当的字符来映射每个二进制值,但我认为您很可能会遇到不同平台以微妙不同的方式解码SMS的问题。如果你愿意的话,可以尝试一下,但我坚信base64是最健壮的方式,它会帮你省去很多心痛。好吧,我们最终使用base64对字节进行编码并通过短信发送。。。我会认为你的答案是正确的,因为你提出了这个建议。谢谢
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());
        }
    }
}
}