2011-09-08 52 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