2012-07-16 48 views
4

我正嘗試將C中的程序重新編寫爲java。我沒有C語言的經驗,但有一些使用C++,所以我理解了一些指針/數組的東西。我稍微迷茫,但...我給下面的代碼在C:將數組/指針從C轉換爲Java

void ProcessStatus(Char *Stat){ 
    DWORD relayDate; 
    DWORD APIDate; 

    version3=false; 
    version4=false; 
    version9=false; 
    tiltAngle = false; 
    ver4features=0; 
    tooNew=false; 
    ProgRev=0; 

    switch(Stat[14]){ 

據我所知,功能ProcessStatus傳遞指針爲char;我假設自從在Stat[14]提供的代碼的最後一行被稱爲它的數組內。

所以我感到困惑的是我如何將指針傳遞給Java中的數組中的字符。

任何幫助將不勝感激,即使它幫助我瞭解C代碼。謝謝。

+0

C中的Char *是字符串。所以String應該在java中爲你工作。 – mihail 2012-07-16 13:23:42

+1

'Char'上的大寫字母'C'是否是錯誤的或故意的 - 即它是C內置類型'char'還是別的?什麼? – Rup 2012-07-16 13:26:11

+1

@mihail不完全。 C中的char *可以是一個字符串,但也可以是存儲二進制數據的通用數組。由於C中的char是8位,並且在java中char是16位,所以正確的轉換是java'byte []'中的一個字節數組。 – 2012-07-16 13:34:33

回答

4

很難說它是一個字符串還是已傳遞的原始數據。

在字符串的情況下,使用Java的內置String類。

void ProcessStatus(String stat) 
{ 
    ... 

    switch (stat.charAt(14)) 
    { 
    } 
} 

在原始數據陣列的情況下,使用byte陣列

void ProcessStatus(byte[] stat) 
{ 
    ... 

    switch (stat[ 14 ]) 
    { 
    } 
} 

順便說一句,C的char數據類型被轉換爲byte類型在Java中。Java中的char類型表示長度爲2個字節的UTF-16字符。 byte正是它(8位,有符號)。

+0

這是原始數據,謝謝老闆 – JuiCe 2012-07-16 13:30:02

+0

你的意思是stat [14]而不是第二個ProcessStatus()函數中的byte [14],對吧? – 2012-07-16 13:53:45

+0

爲什麼它是字節[14]?不是字節類型?我認爲他是正確的調用stat [14]。但我是OP,真的不知道哈哈,讓我知道。 – JuiCe 2012-07-16 13:57:35

2

由於C沒有內置的字符串類型,C中的字符串表示爲一個字符數組。在C中傳遞一個指向數組中第零個元素的指針與在數組中傳遞對數組的引用是等價的,這正是我認爲這段代碼正在做的事情。本質上,用開關(Stat.charAt(14))替換char * Stat與String Stat並切換(Stat [14])

2

首先,爲了澄清,它不是char,而是Char; Char與首都C是一些用戶定義的類型。它可能只是char的typedef,或者它可能是別的;我們不知道。

其次,傳遞給該方法的內容顯然是指向一個Char對象塊的第一個元素的指針。最接近的是Java數組,但是根據您的操作方式,您可以將數據結構完全保留在C中,將指針作爲long傳遞給Java,讓Java通過調用您提供的本機函數來操作它。一個Java數組是從C.一個連續分配的對象的「陣列」或序列用C完全不同

2

大多數時候,當你看到char *(我不知道你最初皚皚Char是)或C++,Java等價物將是Stringchar[]。前者是字符串類,後者是字符數組。

使用String的等效函數簽名看起來像這樣;我們使用charAt訪問15個字符:

void ProcessStatus(String Stat){ 
    // ... 
    switch (Stat.charAt(14)) 
    // ... 
} 

char[]等效看起來像這樣(和它是一個數組,我們索引到它,你在C char *char[]做):

void ProcessStatus(char[] Stat){ 
    // ... 
    switch (Stat[14]) 
    // ... 
} 
+1

C中的char是8位寬,java中的char是16位寬。如果char *是C中的字符串,那麼可以在java中使用String,但如果使用char *存儲原始二進制數據,則應該使用byte []而不是char []。 – 2012-07-16 13:39:13

+0

@FilipePalrinhas:這取決於如何調用函數。如果整個代碼庫正在從C語言轉換爲Java語言,那麼您將使用'char []'。如果函數將被從C中調用,或者由於任何其他原因使用8位數據,那麼當然你應該是'byte []'。從接受的答案看,它實際上不是字符串數據,所以'byte []'對於OP來說是正確的。 – 2012-07-16 13:41:33

+0

「如果整個代碼庫正在從C轉換爲Java,那麼你會使用char []」。如果數據是一個字符串,您可以使用char []或String,但是在java中使用它的正確和最自然的方式是直接使用String。 – 2012-07-16 14:04:06