struct foo_dbc_entry{ uint32_t id; uint32_t some_string; };char* string_block;foo_dbc_entry* entries;for (size_t i (0); i < num_entries; ++i){ printf ( "%i: %i, '%s'n" , entries[i].id , string_block + entries[i].some_string );}
- (NSDictionary *)readDBCFromData:(NSData *)data{ NSData *typeData = [data subdataWithRange:NSMakeRange(0, 4)]; NSString *typeString = [NSString stringWithUTF8String:[typeData bytes]]; NSDictionary *dataDictionary; if ([typeString isEqualToString:@"WDBC"]) { NSData *recordCountData = [data subdataWithRange:NSMakeRange(4, 8)]; NSNumber *recordCount = [NSNumber numberWithInt:*(int*)([recordCountData bytes])]; NSData *fieldCountData = [data subdataWithRange:NSMakeRange(8, 12)]; NSNumber *fieldCount = [NSNumber numberWithInt:*(int*)([fieldCountData bytes])]; dataDictionary = @{ @"recordCount":recordCount, @"fieldCount":fieldCount }; } return dataDictionary;}
NSData *recordCountData = [data subdataWithRange:NSMakeRange(4, 8)];NSNumber *recordCount = [NSNumber numberWithInt:*(int*)([recordCountData bytes])];
NSNumber* recordCount = [NSNumber numberWithInt:*(int*)([data bytes] + 4)];
NSString* name = [NSString stringWithUTF8String:([data bytes] + calculated_offset)];
This confuses me, though:Code: [Select]NSString* name = [NSString stringWithUTF8String:([data bytes] + calculated_offset)];
// const char* file;// const char* records;uint32_t record_count = *(uint32_t*) (file + 1 * sizeof (uint32_t));uint32_t record_size = *(uint32_t*) (file + 3 * sizeof (uint32_t));uint32_t string_block_offset = 5 * sizeof (uint32_t) + record_size * record_count;uint32_t string_offset = *(uint32_t*)(records + i * record_size + sizeof (uint32_t) /* name */);uint32_t calculated_offset = string_block_offset + string_offset;printf ("record %u: %u, %sn", *(uint32_t*)(records + i * record_size /* id */), file + calculated_offset);
Also, should I be using structs in Obj-C? I know it supports them but I've had no need for them up until this point.
NSData* string_block = [data subdataWithRange:NSMakeRange(string_block_offset, [data count])];
[NSString stringWithUTF8String:([string_block bytes] + string_offset)];
Code: [Select]// const char* file;// const char* records;uint32_t record_count = *(uint32_t*) (file + 1 * sizeof (uint32_t));uint32_t record_size = *(uint32_t*) (file + 3 * sizeof (uint32_t));uint32_t string_block_offset = 5 * sizeof (uint32_t) + record_size * record_count;uint32_t string_offset = *(uint32_t*)(records + i * record_size + sizeof (uint32_t) /* name */);uint32_t calculated_offset = string_block_offset + string_offset;printf ("record %u: %u, %sn", *(uint32_t*)(records + i * record_size /* id */), file + calculated_offset);
const char* records = file + 5 * sizeof (uint32_t) /* header */;
How does one move back and forth between columns? That's the last thing that I really fail to understand.