解析二进制MOBI文件:最佳方法?

时间:2014-03-28 12:34:11

标签: objective-c macos cocoa parsing

它包含二进制数据之间的METADATA。我能够用标题Agent_of_Chang2e解析第一行,但我还需要在标题的底部获取元数据。我知道它没有标准细节。

enter image description here

此代码无法解码底线。例如,我得到以下错误的格式化文本:

FÃHANGE</b1èrX)¯­ÌiadenÕniverse<sup><smalÀ|®¿8</¡Îovelÿ·?=SharonÌeeándÓteveÍiller8PblockquoteßßÚ>TIa÷orkyfiction.Áll@eãacÐ0hðortrayedén{n)áreïrzus0¢°usly.Ôhatíean0authhmxétlõp.7N_\
     

©ß©1988âyÓOOKãsòeserved.0ðart)publicaZmayâehproduc

  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    char buffer[1024];
    FILE* file = fopen([path UTF8String], "r");
    if (file != 0)
    {
        while(fgets(buffer, 1024, file) != NULL)
        {
            NSString* string = [[NSString alloc] initWithCString: buffer encoding:NSASCIIStringEncoding];
            NSLog(@"%@",string);
            [string release];
        }
        fclose(file);
    }
    [pool drain];

3 个答案:

答案 0 :(得分:0)

使用NSTasksystem()通过strings实用程序传递文件并解析其输出:

strings /bin/bash | more
...
...
677778899999999999999999999999999999:::;;<<====>>>>>>>>>>>????????   
@(#)PROGRAM:bash  PROJECT:bash-92
...
...

答案 1 :(得分:0)

nielsbot已经发布了link to the format specification

正如您可以在那里阅读的那样,该文件不是文本文件,而是二进制编码。使用NSString实例解析它并不是一个好主意。

你必须读取文件二进制文件,i。即使用NSData

NSData content = [NSData dataWithContentsOfFile:path];

然后你必须自己取出相关信息。例如,如果要读取未压缩的文本长度,您将在链接的文档中找到此信息从位置4开始并且长度为4。

int32_t uncompressedTextLength; // 4 bytes are 32 bit.
[content getBytes:&uncompressedLenght range:NSMakeRange(4, 4)];

也许你必须处理结束。

答案 2 :(得分:0)

首先,我很确定文本将是UTF-8或UTF-16编码。

其次,你不能随机取1024个字节并期望它们作为文本工作。字节顺序怎么样(big endian vs little endian)?