session-ios/Signal/src/util/Conversions.m

44 lines
1.5 KiB
Objective-C

#import "Conversions.h"
#import "Util.h"
@implementation NSData (Conversions)
-(uint16_t) bigEndianUInt16At:(NSUInteger)offset {
require(offset <= self.length-sizeof(uint16_t));
return (uint16_t)[self uint8At:1+offset]
| (uint16_t)((uint16_t)[self uint8At:0+offset] << 8);
}
-(uint32_t) bigEndianUInt32At:(NSUInteger)offset {
require(offset <= self.length-sizeof(uint32_t));
return ((uint32_t)[self uint8At:3+offset] << 0)
| ((uint32_t)[self uint8At:2+offset] << 8)
| ((uint32_t)[self uint8At:1+offset] << 16)
| ((uint32_t)[self uint8At:0+offset] << 24);
}
+(NSData*) dataWithBigEndianBytesOfUInt16:(uint16_t)value {
uint8_t d[sizeof(uint16_t)];
d[1] = (uint8_t)((value >> 0) & 0xFF);
d[0] = (uint8_t)((value >> 8) & 0xFF);
return [NSData dataWithBytes:d length:sizeof(uint16_t)];
}
+(NSData*) dataWithBigEndianBytesOfUInt32:(uint32_t)value {
uint8_t d[sizeof(uint32_t)];
d[3] = (uint8_t)((value >> 0) & 0xFF);
d[2] = (uint8_t)((value >> 8) & 0xFF);
d[1] = (uint8_t)((value >> 16) & 0xFF);
d[0] = (uint8_t)((value >> 24) & 0xFF);
return [NSData dataWithBytes:d length:sizeof(uint32_t)];
}
+(NSData*) switchEndiannessOfData:(NSData*)data{
const void* bytes = [data bytes];
NSMutableData* switchedEndianData = [NSMutableData new];
for (NSUInteger i = data.length; i > 0; --i){
uint8_t byte = *(((uint8_t*)(bytes))+((i-1)*sizeof(uint8_t)));
[switchedEndianData appendData:[NSData dataWithBytes:&byte length:sizeof(byte)]];
}
return switchedEndianData;
}
@end