чтение двоичных файлов с помощью R - PullRequest
2 голосов
/ 03 апреля 2020

Мне нужно перевести проект из c# в R. В этом проекте c# мне нужно обрабатывать двоичные файлы. У меня три проблемы:

1.У меня возникли проблемы с преобразованием этого кода:

//c#     
//this work fine
using (BinaryReader rb = new BinaryReader(archive.Entries[0].Open())){
   a = rb.ReadInt32();
   b = rb.ReadInt32();
   c = rb.ReadDouble();
}

#R
#this work, but it reads different values
#I tried to change the size in ReadBin, but it's the same story. The working diretory is the right one
to.read <- "myBinaryFile.tmp"
line1<-c(readBin(to.read,"integer",2), 
         readBin(to.read,"double",1)) 
Как я могу прочитать float (в c# у меня есть rb.ReadSingle()) в R? Есть ли в R функция для запоминания позиции, которую вы достигли, когда читаете двоичный файл? Поэтому в следующий раз, когда вы прочитаете это снова, вы можете пропустить то, что уже прочитали (как в c# с BinaryReader)

1 Ответ

0 голосов
/ 04 апреля 2020

Ответы на ваши вопросы напрямую:

  1. У меня возникли проблемы с преобразованием этого кода ...

    В чем здесь проблема? Ваш блок кода содержит комментарий «но это та же история», но что это за история? Вы ничего не объяснили здесь. Если ваша проблема с двойным, попробуйте установить readBin(..., size = 8). В вашем случае ваш код будет иметь вид line1 <- c(readBin(to.read,"integer", 2), readBin(to.read, "double", 1, 8)).

  2. Как я могу прочитать float (в c# у меня есть rb.ReadSingle ()) в R?

    Плавающие имеют размер 4 байта в этом случае (я бы предположил), поэтому установите size = 4 в readBin().

  3. Есть ли в R функция запомнить позицию, в которую вы попали, когда читаете двоичный файл? Поэтому в следующий раз, когда вы прочитаете это снова, вы можете пропустить то, что вы уже прочитали (как в c# с BinaryReader)

    Насколько я знаю, ничего не доступно (более знающие люди могут добавить свои входы). Однако вы можете легко написать скрипт-обертку для readBin(), который сделает это за вас. Например, вы можете указать, сколько байтов вы хотите отбросить (т. Е. Это может соответствовать n байтов, которые вы уже прочитали в R), и прочитать столько байтов с помощью фиктивного readBin(), например, readBin(con = yourinput, what = "raw", n = n) где целое число n будет указывать количество байтов, которые вы выбрасываете sh. После этого ваш скрипт-обёртка go может читать последующие байты в переменную по вашему выбору.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...