2013-12-13 63 views
1

我正在開發一個加密短信應用程序,我正在將短信加密到3DES,並且我試圖使用SmsManager.sendDataMessage將字節數組結果發送到另一個手機,但我無法讀取在接收方電話右字節數組,例如:在android中發送非打印字符二進制短信

我的應用程序發送該數組:

[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

如果您從根本上試圖通過基於文本的界面發送任意字節,最安全的方法是使用base-64。 Android中有一個Base64類,這使得這非常簡單。

無可否認,這意味着大小有點膨脹,因此在140個字符中,您只會傳輸105個字節,但至少它是安全的,並且應該可以與任何設備和API一起使用。

+0

我試圖以字節方式發送字節,而不是以文本方式發送,但我不知道爲什麼,我發送的字節沒有收到。而且,base64是一個選項,但我們正試圖通過它減少我們可以通過SMS傳輸的數據長度來避免它。我在嘗試字節,因爲我的朋友用黑莓做了它,我認爲android可以做bb可以做的事情。而且因爲bb必須要知道android發送和android必須知道bb發送的內容,換句話說,短信將從設備發送到另一個設備。 – oware

+0

@oware:問題是,就API而言,SMS本質上是一種文本媒體。您不能以字節方式發送「字節」,因爲您只能根據文本與API進行通信。雖然您可以嘗試查找適當的字符來映射每個二進制值,但我認爲您很可能會遇到不同平臺以不同方式解碼SMS的問題。繼續嘗試,如果你願意,但我強*相信是base64是最強大的方式去這裏,它會爲你節省很多心痛。 –

+0

那麼,我們最終使用base64來編碼字節並通過短信發送它......我會將您的答案標記爲正確的,因爲您建議這樣做。謝謝 – oware

-1

確保您關閉之前沖洗流。看起來你不是在使用流。那麼我會猜測一些長度參數是錯誤的。

如果你在加密之後,爲什麼不發送加密的字符串?不需要嘗試字節。檢查這個片段:http://www.androidsnippets.com/encryptdecrypt-strings

出於好奇:你如何管理加密/解密兩端的密鑰?

+1

問題中不存在任何流 - 只是一個字節數組。 –

+0

加密在本地完美工作,我將它保存在base64中,並且密鑰,每一端都有一個與另一端共享的密鑰 – oware