在 C# 和 Android 的 Java 之间对某些自定义数据进行二进制序列化/反序列化的最简单方法是什么?我想为 Java 找到类似于 C# BinaryWriter 和 BinaryReader 的东西 - 它支持编写原语(如 uint16)和 UTF-8 字符串。
或者也许有更好的方法?
编辑:编译时不知道数据结构
示例写入:
BinaryWriter w = new BinaryWriter(File.OpenWrite(@"D:\data"));
w.Write((UInt16)1234);
w.Write("To jest żółwiątko");
w.Write((UInt16)4567);
最佳答案
在 Java 中,所有原始类型都是有符号的(奇怪的是,甚至是字节!)。因此,如果您想在 Java 中使用 DataInputStream.readInt()
读取有符号整数,则需要写出它们。 。另请注意,readInt() 使用大端字节序。您可以使用 Jon Skeets MiscUtils 的 EndianBinaryReader 之类的东西编写这些内容以便可以在 Android 上读取。
UTF-8 有点棘手,因为 DataInputStream
使用称为 MUTF-8(修改版 UTF-8)的字符串编码。在我们用来在 android 和 .net 之间共享数据的代码中,我们使用简单的游程编码的 UTF-8 字节来表示字符串(-1 为空)。我们在 Java 中的 reader 方法看起来像这样,从 C# BinaryWriter 读取标准 UTF-8 编码的字符串(在第一次写出 Int16 长度之后):
public String readUTF8String() throws ImageFileFormatException, IOException
{
short len = readInt16();
if (len == -1)
return null;
if (len == 0)
return "";
if (len < -1)
throw new ImageFileFormatException("Invalid UTF8 string");
byte[] utf8Bytes = readBytes(len);
return new String(utf8Bytes, "UTF-8");
}
关于C# 和 Android/Java - 跨语言二进制流编写器/读取器? (对于原语和 UTF-8 字符串),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7236813/