我正在尝试使用 java 从使用 .net binaryWriter 编写的文件中读取字符串。
我认为问题在于 .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 读取字符的方式?我该怎么做?
还有什么我想念的吗?
谢谢。
最佳答案
好的,您已经通过发音正确地解析了长度 - 但您随后将其视为以字符为单位的长度。据我从文档中得知,它的长度是字节。
所以你应该把数据读入一个合适长度的byte[]
,然后使用:
return new String(bytes, encoding);
其中 encoding
是基于从 .NET 编写的任何内容的适当编码...它将默认为 UTF-8,但可以将其指定为其他内容。
顺便说一句,我个人不会扩展DataInputStream
- 我会编写它,即让你的类型或方法获取一个DataInputStream
(或者可能只是获取InputStream
并将其包装在一个DataInputStream
中)。一般来说,根据我的经验,如果您更喜欢组合而不是继承,它可以使代码更清晰、更易于维护。
关于java - 从使用 .net 编写的文件中读取字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7346809/