2011-09-08 38 views
2

我想用java從用.net binaryWriter編寫的文件中讀取字符串。從用.net編寫的文件中讀取字符

我認爲這個問題是因爲.net二進制編寫器爲它的字符串使用了一些7位格式。通過在線研究,我發現這個代碼應該像二進制閱讀器的readString()方法那樣工作。這是在擴展DataInputStream的CSDataInputStream類中。

public String readStringCS() throws IOException { 
    int stringLength = 0; 
    boolean stringLengthParsed = false; 
    int step = 0; 
    while(!stringLengthParsed) { 
     byte part = readByte(); 
     stringLengthParsed = (((int)part >> 7) == 0); 
     int partCutter = part & 127; 
     part = (byte)partCutter; 
     int toAdd = (int)part << (step*7); 
     stringLength += toAdd; 
     step++; 
    } 
    char[] chars = new char[stringLength]; 
    for(int i = 0; i < stringLength; i++) { 
     chars[i] = readChar(); 
    } 
    return new String(chars); 
} 

第一部分似乎正在工作,因爲它正在返回正確數量的字符(7)。但是當它讀到人物時,他們都是中國人!我敢肯定,問題是DataInputStream.readChar(),但我不知道爲什麼它不工作......我一直在使用

Character.reverseBytes(readChar()); 

讀取字符,看是否將工作甚至嘗試,但它只會返回不同的中文字符。

也許我需要模仿.net的閱讀字符的方式?我會怎麼做呢?

還有什麼我不見了?

謝謝。

+0

一個.net二進制編碼器可以寫入任何編碼的字符串。它默認爲UTF8,但可能使用UTF-7。 Java可以不處理轉換不同的字符編碼,而不必訴諸自定義代碼來做到這一點?同時尋找確定的文字編碼時使用的字符編碼將有所幫助。 – Chris

回答

2

好吧,你已經通過它的聲音正確地解析了長度 - 但是你將它當作字符的長度。據我所知,這是字節的長度。

所以,你應該將數據讀入合適的長度的byte[],然後用:

return new String(bytes, encoding); 

其中encoding是適當的基於無論是從.NET ......它會默認爲寫上編碼UTF-8,但它可以被指定爲別的東西。

順便說一句,我個人不會延長DataInputStream - 我會組成它來代替,即讓你的類型或方法採取一個DataInputStream(或者只是採取InputStream和包裝,在一個DataInputStream) 。一般來說,如果您贊成繼承,那麼根據我的經驗,它可以使代碼更清晰,更容易維護。

+0

這工作!非常感謝! – Matt

+0

if(jonSkeet.getComputationPower()> humanoid.getComputationPower()){}我100%肯定這個語句將返回true – doNotCheckMyBlog

相關問題