2013-11-02 31 views
0

我正在嘗試開發一個Android應用程序,它的功能和使用C++編寫的函數一樣,可以在手機和遠程以太網接口之間進行通信(我不知道它到底是什麼......) 。在Android中翻譯C++函數

我知道我必須傳遞給接口15個字節,從十六進制值中檢索,試點連接到接口的一些負載。

我已經嘗試了一些東西,最接近正確的解決方案似乎是這樣的一個:

HttpClient httpclient = new DefaultHttpClient(); 
HttpPost httppost = new HttpPost("http://192.168.2.100:1001"); 

     try { 
      //String message "AA10A0F0F0FFFF0102FF00010091A5";    
      byte[] messaggioInBytes={(byte)10101010, //AA 
        (byte)00010000, //10 
        (byte)10100000, //A0 
        (byte)11110000, //F0 
        (byte)11110000, //F0 
        (byte)11111111, //FF 
        (byte)11111111, //FF 
        (byte)00000001, //01 
        (byte)00000010, //02 
        (byte)11111111, //FF 
        (byte)00000000, //00 
        (byte)00000001, //01 
        (byte)00000000, //00 
        (byte)10010001, //91 
        (byte)10100101}; //A5 

      httppost.setEntity(new ByteArrayEntity(messaggioInBytes)); 

      // Execute HTTP Post Request 

      httpclient.execute(httppost); 


      } catch(Exception e){ 
       Log.i("ConnectionHandler", "Error", e); 

      } 

這段代碼的以太網接口停止閃爍,並把自己聽,但它似乎沒有接收正確的字節命令字符串。

我的疑惑被連接到: 1.命令的格式發送 2.連接類型使用

我知道系統中的唯一的事情是,它使用本C效果很好++函數,所以我想知道是否有一種方法可以在Android的Java代碼中翻譯它,而不是使用Android NDK導入它。

C++函數如下:

void __fastcall TForm1::SendClick(TObject *Sender) 
{ 
unsigned char Buffer[15]; 
AnsiString Line; 
Buffer[0] = 0xAA; 
... 
Buffer[13] = 0x91; 
Buffer[14] = 0xA5; 
ClientSocket1->Socket->SendBuf(Buffer,15); 
} 

是否有任何人誰可以點我朝着正確的方向?

回答

0

不知道如果您有其他問題,但是當您嘗試使用字節填充陣列時,您嘗試獲取錯誤數字的字節值。

(byte) 00010000 

正試圖將10000(萬)填充到一個字節中。 嘗試把在十六進制值代替,

(byte)0xAA, (byte)0x10, etc. 

寫了一個小測試類,只是爲了驗證,試圖投下一個字節的比特表示是問題:

public class TestByteArray { 

static byte[] myTestArray = {(byte) 0xAA, 
         (byte) 0x10, 
         (byte) 0xA0, 
         (byte) 0xF0, 
         (byte) 0xF0, 
         (byte) 0xFF, 
         (byte) 0xFF, 
         (byte) 0x01, 
         (byte) 0x02, 
         (byte) 0xFF, 
         (byte) 0x00, 
         (byte) 0x01, 
         (byte) 0x00, 
         (byte) 0x91, 
         (byte) 0xA5}; 

static byte[] myBitTestArray = {(byte)10101010, //AA 
         (byte)00010000, //10 
         (byte)10100000, //A0 
         (byte)11110000, //F0 
         (byte)11110000, //F0 
         (byte)11111111, //FF 
         (byte)11111111, //FF 
         (byte)00000001, //01 
         (byte)00000010, //02 
         (byte)11111111, //FF 
         (byte)00000000, //00 
         (byte)00000001, //01 
         (byte)00000000, //00 
         (byte)10010001, //91 
         (byte)10100101}; //A5 

public static void main(String[] args) { 
    for(int i = 0;i < myTestArray.length; i++) 
    { 
     if(myTestArray[i] != myBitTestArray[i]) 
     { 
      System.out.println("The value in myTestArray at index " + i + " is " + Integer.toHexString(myTestArray[i] & 0xFF).toUpperCase()); 
      System.out.println("The value in myBitTestArray at index " + i + " is " + Integer.toHexString(myBitTestArray[i] & 0xFF).toUpperCase()); 
     } 
     else 
      System.out.println("Arrays are equal at index " + i); 
    } 

} 

}

+1

FWIW ,前導0導致「00010000」被解釋爲八進制值 - 實際上是32768,而不是10000. Java的行爲與C++相同。 – fadden

+0

是的,我不確定,謝謝。無論哪種方式,值00010000都不是0x10。 – Harley

+0

謝謝你的評論。經過一番努力,我才解決了這個問題。我測試了ClientSocket1-> Socket-> SendBuf(Buffer,15);相當於一個java套接字,我可以簡單地使用outputstream就像在C++中一樣發送字節。最後一個問題是我不得不考慮哈雷寫道,初始化字節數組的方式:我認爲有可能使用位,但是,然後用valueOf()打印值,我看到結果不是那些我期待找到的。有一件事我想知道更多的是在字節溢出的情況下會發生什麼:(byte)(buf [0] + ... + buf [n])> 255 –