C ++ API записывает Varint в файл иначе, чем в сокет - PullRequest
2 голосов
/ 05 июня 2011

Я хочу спросить, потому что нахожу это странным: способ написания varint зависит от цели.

Мой простой код может записывать в файл или в сокет. Когда я пишу в файл, hexdump показывает

0000000 02ac
0000002

Когда я пишу в сокет, клиент C #, который читает побайтно, показывает

переменного тока 02

код для этого:

Приложение C ++

  if(connect(fd, (sockaddr*)&addr, sizeof(addr))<0) {
    perror("połączenie nieudane");
    return -1;
    }

  //int fd = open("myfile", O_WRONLY | O_TRUNC);
   ZeroCopyOutputStream* raw_output = new FileOutputStream(fd);
   CodedOutputStream* coded_output = new CodedOutputStream(raw_output);

   coded_output->WriteVarint32(300);

   delete coded_output;
   delete raw_output;
   close(fd);

Приложение C #

var str = client.GetStream();
while(str.DataAvailable) {
                b = (byte)str.ReadByte();
                Console.Write("{0:x2}  ", b);
            } 

Я думал, что не должно быть никакой разницы. Я не могу объяснить это себе. Вы знаете, что случилось?

1 Ответ

3 голосов
/ 05 июня 2011

Я предполагаю, что вы используете hexdump (или od), чтобы показать содержимое файла, и что у вас на самом деле нет проблем; -)

Демо-версия:

$ echo -n ab > file
$ hexdump file
0000000 6261          # notice this is 'ba'
0000002
$ hexdump -C file
00000000  61 62                                             |ab|
00000002

Без опций hexdump будет интерпретировать данные в 16-битных блоках, а не побайтно. Используйте -C, чтобы получить порядок вывода для каждой 8-битной величины.

У вас не будет этой проблемы (отображения) на машине с прямым порядком байтов.

...