2011-02-24 39 views
6

我解析Java中的字節數組具有以下規格的領域:解析字節數組方含未知長度

Trace data format: 
    - 4 bytes containing the Id. 
    - 4 bytes containing the address. 
    - N bytes containing the first name, where 0 < N < 32 
    - N bytes containing the last name, where 0 < N < 32 
    - 4 bytes containing the Minimum 
    - 4 bytes containing the Maximum 
    - 4 bytes containing the Resource Default Level 

今天我沒有看到任何解決方案來分析,爲了這個數組得到7變量正確的類型。您是否確認或我缺少像Java中的魔術函數那樣的字符數組中的字符串「限制」(我無法瞭解最小值與其相關的ASCII字符的區別)。

有沒有關於2個字符串之間的特殊字符的任何「約定」?

+0

你怎麼知道,當你讀過全名嗎? – 2011-02-24 15:16:42

+0

它們可以是以空字符結尾的字符串嗎? – Nick 2011-02-24 15:19:05

+4

你能爲你的問題提供一個更好的標題嗎?目前的一個可以應用於SO的大部分問題。 – 2011-02-24 15:20:38

回答

12

那麼,你知道第一個名字從字節9開始,並且姓氏以字節(長度爲13)結尾。不確定的是如何找到名字的結尾和姓氏的開頭。我看到一些可能的結果:

  • 如果格式是由C程序員定義的,那麼這兩個名稱字段很可能以空字節結尾,因爲這是字符串的C約定。
  • 如果它是由Java程序員定義的,則它可能由writeUTF()寫入,這意味着字節計數的說明很可能是錯誤的。但是,這至少指定了編碼,否則這是一個未解決的問題。
  • 如果它是由COBOL程序員定義的,則這兩個字段可以是固定長度的,並填充零或空格,格式規範列出了有效載荷長度而不是字段長度。
  • 如果它是由一個真正無能的程序員(無論是哪種語言)定義的,它包含兩個沒有分隔符或計數的名字,所以不可能將它們可分開(如果你沒有這些信息,就沒有「魔法」在Java或其他地方的功能,可以變出空氣)。我想你可能希望姓氏總是以大寫字母開頭,沒有人使用雙名或全部大寫字母。
2

如果您想讀取N個ASCII字節並將它們轉換爲字符串。

public static String readString(DataInputStream dis, int num) throws IOException { 
    byte[] bytes = new byte[num]; 
    dis.readFully(bytes); 
    return new String(bytes, 0); 
} 

對於其餘值,你可以使用

dis.readInt(); 

如果你問,如果有任何辦法知道弦有多長,我不相信你能確定這從提供的信息。也許字符串'0'字節終止或長度爲第一個字節。也許如果你看看文件中的字節,你會看到格式是什麼。

od -xc my-format.bin 
+0

我認爲問題是O.P.不知道字符串有多長...... – Nick 2011-02-24 15:19:48

+0

他需要做更多的調查來解決這個問題。原始問題中他沒有足夠的信息。 – 2011-02-24 15:22:18

5

是否有任何「公約」有關的兩個字符串之間的特殊字符?

那麼c-strings通常是空終止\0

如果沒有這樣的字符,我會說這是不可能的解析結構。

3

假設第一和最後一個名字是空值終止你會做這樣的:

int firstNameLength = 0; 
while(firstNameLength<32) { 
    if(theArray[firstNameLength]=='0') break; 
    firstNameLength++; 
} 
int lastNameLength = 0; 
while(lastNameLength<32) { 
    if(theArray[8+firstNameLength+1+lastNameLength]=='0') break; 
    i++; 
} 
String firstName = new String(theArray).substring(8,8+firstNameLength); 
String lastName = new String(theArray).substring(8+firstNameLength+1,8+firstNameLength+1+lastNameLength); 
0

只是爲了增加對邁克爾的回答另一種可能性。

假設N是兩個字段相同,並且由於使用了相同的信我猜想,這種情況下,本場位置會是這樣:

int len = array.length; 
int varLen = len - 5*4; 
int fieldPos[] = new int[7]; 
fieldPos[0] = 0; 
fieldPos[1] = 4; 
fieldPos[2] = 8; 
fieldPos[3] = 8 + varLen; 
fieldPos[4] = 8 + 2*varLen; 
fieldPos[5] = 8 + 2*varLen + 4; 
fieldPos[6] = 8 + 2*varLen + 8; 
相關問題