iPhone пишет бинарные данные

Как записать бинарные данные в файл? Я хочу записать поплавки в файл, необработанный, а затем прочитать их как поплавки. Как ты это делаешь?


person quano    schedule 06.10.2009    source источник


Ответы (2)


Были эксперименты с этим:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *file = [documentsDirectory stringByAppendingPathComponent:@"binaryData"];

float b = 32.0f;

NSMutableData *data = [NSMutableData dataWithLength:sizeof(float)];
[data appendBytes:&b length:sizeof(float)];
[data writeToFile:file atomically:YES];

NSData *read = [NSData dataWithContentsOfFile:file];
float b2;
NSRange test = {0,4};
[read getBytes:&b2 range:test];

Странно то, что записанный файл кажется 8 байтом, а не 4. Можно даже инициализировать nsdata с нулевой длиной, добавить число с плавающей запятой и затем записать, и тогда файл будет 4 байта. Почему NSData по умолчанию добавляет 4 байта? NSData с длиной 4 должен привести к файлу с длиной 4, а не 8.

person quano    schedule 06.10.2009
comment
Можете ли вы использовать шестнадцатеричный редактор для проверки содержимого файла, когда он имеет 8 байтов? Мне кажется, вы должны быть в состоянии выбрать, какие 4 являются вашим поплавком, а остальные 4 могут дать вам ключ к пониманию того, что идет не так. - person Tim; 06.10.2009
comment
Конечно. Последние 4 - поплавок. Файл выглядит так: 00 00 00 00 00 00 00 42 - person quano; 06.10.2009
comment
По-видимому, инициализация NSMutableData с длиной приводит к тому, что она добавляет эту длину к своим данным и впоследствии указывает на пробел. Инициирование его длиной 0 является решением. Тогда можно задаться вопросом, почему вообще нужно инициализировать его любой другой длиной, кроме 0. - person quano; 06.10.2009

Обратите внимание, что Objective-C — это только расширение языка программирования C.

Обычно я создаю NSFileHandle, а затем пишу бинарные данные следующим образом:

NSFileHandle handle*;
float f;

write([handle fileDescriptor], &f, sizeof(float));
person Sulthan    schedule 24.03.2011