Редактировать бинарный файл, используя R - PullRequest
0 голосов
/ 25 апреля 2018

Мне нужно отредактировать существующий двоичный файл, используя R, двоичный файл можно скачать здесь: https://www.dropbox.com/s/1a4mb6pj5heju4t/CAMTRAP.CTC?dl=0.

Оригинальный файл был написан на C, со следующей структурой:

typedef struct  {
 int8 RTCMonth; // RTC properties used to set camera clock
 int8 RTCDay;
 int8 RTCHour;
 int8 RTCMin;
 int8 RTCSec;
 int16 RTCYear;
 int8 setRTC; // set = 1 to set the RTC using the RTC properties
 int8 softwareVersion[51];
 int16 flashImagesPerTrigger;
 int16 daylightImagesPerTrigger;
 int16 delayBetweenImagesFlash;
 float delayBetweenImagesDaylight;
 int32 imageCounter;
 int8  clearImageCounter; // set = 1 to clear image counter
 int16 SPARE0;
 int8 cameraID[9];
 int8 usbBackupMethod; // 0=FULL, 1=INCREMENTAL, 2=FULL PLUS DELETE
 int16 flashImageBrightness; // 0=NORMAL, 1=BRIGHT, 2=BRIGHTEST
 int8  RESERVED1[32];
 int8  RESERVED2;
 int8 logFileExtention[3];
 int8 SPARE1[3];
 int8 RESERVED3;
 float flashCrossoverCdS; 
 int8  setFlashCrossoverCdS; // = 1 to set
 float SPARE3;   
 int8  SPARE4;
 float AspectRatio;    
 int8 setAspectRatio; // = 1 to set
 int8 derivativeClipNormal;  
 int8 setDerivativeClipNormal; // = 1 to set
 int8 purgeLogFile; // = 1 to purge log file
 int8 SPARE5; 
 float chargeFlashTarget;   
 int8 setChargeFlashTarget; // = 1 to set
 int8 jpegCompressionRatio; // 12=LOW, 24=MEDIUM, 40=HIGH
 int8 setJpegCompressionRatio; // = 1 to set
 int8 setExifComment; // = 1 to set
 int8 exifComment[50];
 //GPS parms and location data 
 int8 setRTCFromGPS; // = 1 to set
 int8  RESERVED4;
 int16 utcOffsetHours; // local UTC time adjustment
 int16 utcOffsetMinutes;
 int8 adjustRtcForDaylightSavings; // set = 1 to enable
 int8 daylightSavingsBeginMonth;
 int8 daylightSavingsBeginDay;
 int8 daylightSavingsEndMonth;
 int8 daylightSavingsEndDay;
 int8 clearGpsData; // set = 1 to clear GpsData
 int32  latitudeRef;
 int32  latitudeDegrees;
 int32  latitudeMinutes;
 int32  latitudeSeconds;
 int32  longitudeRef;
 int32  longitudeDegrees;
 int32  longitudeMinutes; 
 int32  longitudeSeconds; 
 int8   altitudeRef; 
 int32  altFromMSL; 
 int8   RESERVED5;
 int8   setGpsLocation;  // = 1 to set
 int8   encryptJpgFiles; // set = 1 to enable
 int8   RESERVED6;
 float  bootLoaderVersion;
 int8   powerLock; // set = 1 to enable
 int8   stealthLedMode; // 0=OFF, 1=No LED indications after initialization, 2=No LED's, extended day, 3=NoLEDs, Extended Day, No Flash Pics
 int8   RESERVED7;
 float RESERVED8;
 float RESERVED9; 
 int32 V4SPARE0[2];
 int8  sdCardCleanup; // = 1 to set
 int8  enableTrafficBlocking; // = 1 to set
 int8  V4SPARE[22];
 int8  serverHostname[40];
 int8  serverPort[6];
 int8  networkAPN[40];
 int8  apnUserID[16];
 int8  apnPassword[16];
 int8  apnOperNum[9];
 int8  hardwareTag[10];
 int16 HourForLogUpload; // 0-23 (set > 23 to disable)
 int8  FlashlightMode; // = 1 to set
 int16 MaxDailyImageUploads;
 int8  disableVehicleDetection; // = 1 to set 
 int8  disableHumanDetection; // = 1 to set
 int8  initialLEDactiveMinutes;
 int32 RESERVED10;
 int8  synchCameraClockWithServer; // = 1 to set  
 int8  sendImageWithLogFileUpload; // = 1 to set
 int8  RESERVED11[545];
}SYS_CONFIG; //1024bytes

Я не очень знаком с бинарными файлами, но, по словам автора, члены располагаются с прямым порядком байтов, после выравнивания элементов по умолчанию (т. Е. Имеется байт заполнения для правильного выравнивания "короткого" элемента структуры на 2-байтовой границе, так что всякий раз, когда «int» или «short» следует за «char», вставляется дополнительный байт для поддержания правильного выравнивания).

Я в основном пишу приложение Shiny, которое позволит пользователям редактировать свой собственный двоичный файл (который следует той же структуре, что и в примере). Единственная проблема в том, что мне не повезло с навигацией по этому двоичному файлу. До сих пор я пытался использовать readBin и writeBin, и хотя readBin позволяет мне просматривать определенные аспекты файла, я, похоже, не могу понять структуру этих данных.

Я не ищу, чтобы кто-то написал мой код для меня, но, пожалуйста, кто-то может помочь объяснить, как я могу использовать R для редактирования определенных аспектов этого конкретного двоичного файла. Например, скажем, я хотел изменить exifComment, чтобы включить некоторый случайный текст. Как найти этот раздел двоичного файла, а затем применить и сохранить в нем новые данные? Возможно ли это даже в R?

Заранее спасибо!

PS - извиняюсь, если я пропустил какую-либо важную информацию, но это все, с чем мне нужно работать.

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