C # и Android / Java - кросс-языковые средства записи / чтения двоичных потоков?(для примитивов и строк UTF-8) - PullRequest
0 голосов
/ 30 августа 2011

Какой самый простой способ выполнить двоичную сериализацию / десериализацию некоторых пользовательских данных между 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);

Ответы [ 3 ]

2 голосов
/ 30 августа 2011

В Java все примитивные типы подписаны (странно четный байт!).Поэтому вам нужно будет выписать целые числа со знаком, если вы хотите прочитать их в Java, используя DataInputStream.readInt().Также обратите внимание, что readInt () использует big-endian.Вы можете использовать что-то вроде EndianBinaryReader от Jon Skeets MiscUtils , чтобы написать их, чтобы их можно было прочитать на Android.

UTF-8 немного сложнее, так как DataInputStream использует что-то под названием MUTF-8 (Модифицированный UTF-8) Кодировка для строк.В коде, который мы используем для обмена данными между android и .net, мы используем простые байты UTF-8 в кодировке длины строки для представления строки (-1 - ноль).Наш метод чтения в Java выглядит примерно так, чтобы читать стандартные строки в кодировке UTF-8 из C # BinaryWriter (после первой записи длины 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");
 }
0 голосов
/ 22 марта 2012

Несколько дней назад я столкнулся с такой же ситуацией. Вот мое решение, попробуйте это (код C #):

public static void WriteUTF(this BinaryWriter writer, string s)
{
    short length = (short)Encoding.UTF8.GetByteCount(s);
    writer.Write(BitConverter.GetBytes(length).Reverse().ToArray());
    writer.Write(s.ToCharArray());
}
0 голосов
/ 30 августа 2011

Удовлетворяет ли какая-либо из этих библиотек вашим потребностям?

  • Буферы протокола - "Буферы протокола - это способ кодирования структурированных данных в эффективном, но расширяемом формате.Google использует протокольные буферы почти для всех своих внутренних протоколов RPC и форматов файлов. "

  • Apache Thrift -" Thrift - это программная структура для масштабируемого кросс-языкаразработка сервисов. Он объединяет программный стек с механизмом генерации кода для создания сервисов, которые эффективно и без проблем работают между C ++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C #, Какао, JavaScript, Node.js, Smalltalk,и OCaml. "

...