// // NSData-BytePacking.m // // Created by Philippe Hausler on 9/10/08. // Copyright 2008 Philippe Hausler. All rights reserved. // #import "NSData-BytePacking.h" NSByteEndian NSHostEndian() { if(NSHostByteOrder() == NS_LittleEndian) { return NSLittleEndian; } else if(NSHostByteOrder() == NS_BigEndian) { return NSBigEndian; } return NS_UnknownByteOrder; } @implementation NSString (BytePacking) + (id)stringWithData:(NSData *)data encoding:(NSStringEncoding)encoding { return [[[NSString alloc] initWithData:data encoding:encoding] autorelease]; } @end @implementation NSData (BytePacking) - (NSString *)stringUsingEncoding:(NSStringEncoding)encoding { return [NSString stringWithData:self encoding:encoding]; } - (BOOL)hasPrefix:(NSData *)data { return [[self subdataWithRange:NSMakeRange(0, [data length])] isEqualToData:data]; } - (BOOL)hasSuffix:(NSData *)data { return [[self subdataWithRange:NSMakeRange([self length]-[data length]-1, [data length])] isEqualToData:data]; } - (BOOL)hasUTF8Prefix:(NSString *)prefix { return [self hasPrefix:[prefix dataUsingEncoding:NSUTF8StringEncoding]]; } - (BOOL)hasUTF8Suffix:(NSString *)suffix { return [self hasSuffix:[suffix dataUsingEncoding:NSUTF8StringEncoding]]; } + (NSData *)dataWithUTF8String:(NSString *)aString { return [aString dataUsingEncoding:NSUTF8StringEncoding]; } - (unsigned char)byteAtIndex:(NSUInteger)index { unsigned char byte = 0x00; [self getBytes:&byte range:NSMakeRange(index, 1)]; return byte; } - (unsigned int)uintAtIndex:(NSUInteger)index { unsigned int number = 0x00; [self getBytes:&number range:NSMakeRange(index, sizeof(unsigned int))]; return number; } - (NSData *)dataUntilTermination:(NSData *)terminator { NSUInteger pos = 0; while(pos < [self length]) { if([[self subdataWithRange:NSMakeRange(pos, [terminator length])] isEqualToData:terminator]) { return [self subdataWithRange:NSMakeRange(0, pos)]; } pos++; } return NULL; } + (id)dataWithByte:(unsigned char)byte { return [NSData dataWithBytes:&byte length:1]; } @end @implementation NSMutableData (BytePacking) - (void)pad:(NSData *)pad count:(NSUInteger)count { for(NSUInteger i = 0; i < count; i++) { [self appendData:pad]; } } - (void)appendString:(NSString *)aString encoding:(NSStringEncoding)encoding { [self appendData:[aString dataUsingEncoding:encoding]]; } - (void)appendByte:(unsigned char)byte { [self appendBytes:&byte length:1]; } - (void)appendShort:(short)number { [self appendShort:number ordered:NSSameEndian]; } - (void)appendUShort:(unsigned short)number { [self appendUShort:number ordered:NSSameEndian]; } - (void)appendInt:(int)number { [self appendInt:number ordered:NSSameEndian]; } - (void)appendUInt:(unsigned int)number { [self appendUInt:number ordered:NSSameEndian]; } - (void)appendLong:(long)number { [self appendLong:number ordered:NSSameEndian]; } - (void)appendULong:(unsigned long)number { [self appendULong:number ordered:NSSameEndian]; } - (void)appendDouble:(double)number { [self appendULong:number ordered:NSSameEndian]; } - (void)appendLongLong:(long long)number { [self appendLongLong:number ordered:NSSameEndian]; } - (void)appendULongLong:(unsigned long long)number { [self appendLongLong:number ordered:NSSameEndian]; } - (void)appendShort:(short)number ordered:(NSByteEndian)endian { switch (endian) { case NSLittleEndian: { short bytes = NSSwapHostShortToLittle((unsigned short)number); [self appendBytes:&bytes length:sizeof(short)]; break; } case NSBigEndian: { short bytes = NSSwapHostShortToBig((unsigned short)number); [self appendBytes:&bytes length:sizeof(short)]; break; } case NSSameEndian: { [self appendBytes:&number length:sizeof(short)]; break; } } } - (void)appendUShort:(unsigned short)number ordered:(NSByteEndian)endian { switch (endian) { case NSLittleEndian: { unsigned short bytes = NSSwapHostShortToLittle(number); [self appendBytes:&bytes length:sizeof(unsigned short)]; break; } case NSBigEndian: { unsigned short bytes = NSSwapHostShortToBig(number); [self appendBytes:&bytes length:sizeof(unsigned short)]; break; } case NSSameEndian: { [self appendBytes:&number length:sizeof(unsigned short)]; break; } } } - (void)appendInt:(int)number ordered:(NSByteEndian)endian { switch(endian) { case NSLittleEndian: { int bytes = NSSwapHostIntToLittle((unsigned int)number); [self appendBytes:&bytes length:sizeof(int)]; break; } case NSBigEndian: { int bytes = NSSwapHostIntToBig((unsigned int)number); [self appendBytes:&bytes length:sizeof(int)]; break; } case NSSameEndian: { [self appendBytes:&number length:sizeof(int)]; break; } } } - (void)appendUInt:(unsigned int)number ordered:(NSByteEndian)endian { switch(endian) { case NSLittleEndian: { unsigned int bytes = NSSwapHostIntToLittle(number); [self appendBytes:&bytes length:sizeof(unsigned int)]; break; } case NSBigEndian: { unsigned int bytes = NSSwapHostIntToBig(number); [self appendBytes:&bytes length:sizeof(unsigned int)]; break; } case NSSameEndian: { [self appendBytes:&number length:sizeof(unsigned int)]; break; } } } - (void)appendLong:(long)number ordered:(NSByteEndian)endian { switch(endian) { case NSLittleEndian: { long bytes = NSSwapHostLongToLittle((unsigned long)number); [self appendBytes:&bytes length:sizeof(long)]; break; } case NSBigEndian: { long bytes = NSSwapHostLongToBig((unsigned long)number); [self appendBytes:&bytes length:sizeof(long)]; break; } case NSSameEndian: { [self appendBytes:&number length:sizeof(long)]; break; } } } - (void)appendULong:(unsigned long)number ordered:(NSByteEndian)endian { switch(endian) { case NSLittleEndian: { unsigned long bytes = NSSwapHostLongToLittle(number); [self appendBytes:&bytes length:sizeof(unsigned long)]; break; } case NSBigEndian: { unsigned long bytes = NSSwapHostLongToBig(number); [self appendBytes:&bytes length:sizeof(unsigned long)]; break; } case NSSameEndian: { [self appendBytes:&number length:sizeof(unsigned long)]; break; } } } - (void)appendDouble:(double)number ordered:(NSByteEndian)endian { switch(endian) { case NSLittleEndian: { NSSwappedDouble bytes = NSSwapHostDoubleToLittle(number); [self appendBytes:&bytes length:sizeof(NSSwappedDouble)]; break; } case NSBigEndian: { NSSwappedDouble bytes = NSSwapHostDoubleToBig(number); [self appendBytes:&bytes length:sizeof(NSSwappedDouble)]; break; } case NSSameEndian: { [self appendBytes:&number length:sizeof(double)]; break; } } } - (void)appendLongLong:(long long)number ordered:(NSByteEndian)endian { switch(endian) { case NSLittleEndian: { long long bytes = NSSwapHostLongLongToLittle((unsigned long long)number); [self appendBytes:&bytes length:sizeof(long long)]; break; } case NSBigEndian: { long long bytes = NSSwapHostLongToBig((unsigned long long)number); [self appendBytes:&bytes length:sizeof(long long)]; break; } case NSSameEndian: { [self appendBytes:&number length:sizeof(long long)]; break; } } } - (void)appendULongLong:(unsigned long long)number ordered:(NSByteEndian)endian { switch(endian) { case NSLittleEndian: { unsigned long long bytes = NSSwapHostLongToLittle(number); [self appendBytes:&bytes length:sizeof(unsigned long long)]; break; } case NSBigEndian: { unsigned long long bytes = NSSwapHostLongToBig(number); [self appendBytes:&bytes length:sizeof(unsigned long long)]; break; } case NSSameEndian: { [self appendBytes:&number length:sizeof(unsigned long long)]; break; } } } @end