我有一个NSData对象,长度为4个字节。这些四个字节我是来自另一个NSData对象使用提取,NSData的转换成int
fourByteData=[completeData subdataWithRange:NSMakeRange(0, 16)];
我的第一个问题是,上面的语句提供我是完整数据的前四个字节。
如果是,那么如何将所有这些字节转换为等效的int。
我有一个NSData对象,长度为4个字节。这些四个字节我是来自另一个NSData对象使用提取,NSData的转换成int
fourByteData=[completeData subdataWithRange:NSMakeRange(0, 16)];
我的第一个问题是,上面的语句提供我是完整数据的前四个字节。
如果是,那么如何将所有这些字节转换为等效的int。
是268566528您所期望的价值或者你希望528?如果正确的值是528,那么字节顺序是big-endian,但cpu是little-endian,字节需要颠倒。
所以,如果正确的值应该是528,那么:
NSData *data4 = [completeData subdataWithRange:NSMakeRange(0, 4)];
int value = CFSwapInt32BigToHost(*(int*)([data4 bytes]));
还要注意,网络标准顺序是大端。
这种说法会给你第一个16个字节的数据,而不是4.要得到你需要修改语句前4个字节:
fourByteData = [completeData subdataWithRange:NSMakeRange(0, 4)];
要阅读从NSData对象所涉及的数据整数你可以这样做:
int theInteger;
[completeData getBytes:&theInteger length:sizeof(theInteger)];
如果你只是把它转换为一个整数,你不需要得到前4个字节。您可以直接从上述两行执行此操作,并且您的completeData
接收器
完美的解决方案,这种方式一步即可完成LSB(iOS准备就绪) –
- (unsigned)parseIntFromData:(NSData *)data{
NSString *dataDescription = [data description];
NSString *dataAsString = [dataDescription substringWithRange:NSMakeRange(1, [dataDescription length]-2)];
unsigned intData = 0;
NSScanner *scanner = [NSScanner scannerWithString:dataAsString];
[scanner scanHexInt:&intData];
return intData;
}
int numberOfChunks = [self parseIntFromData:data];
迄今为止的最佳解决方案 –
iOS整数存储第一个字节的LSB(最低有效字节)和最后一个字节的MSB。我有转换例程来测试所有这些事情。点击这里,
测试...
int i = 2342342;
NSData * d1 = [Util dataFromInt:i]; // {[MSB], ..., ... ,[LSB]} <0023bdc6>
NSData * d2 = [NSData dataWithBytes:&i length:4]; // {[LSB], ..., ... ,[MSB]} <c6bd2300>
int ci1 = [Util intFromData:d1];
int ci2 = [Util intFromDataReverse:d2];
Util.m
+ (NSData *) dataFromInt:(int)num {
unsigned char * arr = (unsigned char *) malloc(sizeof(num) * sizeof(unsigned char));
for (int i = sizeof(num) - 1 ; i >= 0; i --) {
arr[i] = num & 0xFF;
num = num >> 8;
}
NSData * data = [NSData dataWithBytes:arr length:sizeof(num)];
free(arr);
return data;
}
// {[MSB], ..., ... ,[LSB]}
+ (int) intFromData:(NSData *)data
{
int intSize = sizeof(int); // change it to fixe length
unsigned char * buffer = malloc(intSize * sizeof(unsigned char));
[data getBytes:buffer length:intSize];
int num = 0;
for (int i = 0; i < intSize; i++) {
num = (num << 8) + buffer[i];
}
free(buffer);
return num;
}
// {[LSB], ..., ... ,[MSB]}
+ (int) intFromDataReverse:(NSData *)data
{
int intSize = sizeof(int);// change it to fixe length
unsigned char * buffer = malloc(intSize * sizeof(unsigned char));
[data getBytes:buffer length:intSize];
int num = 0;
for (int i = intSize - 1; i >= 0; i--) {
num = (num << 8) + buffer[i];
}
free(buffer);
return num;
}
太棒了!特别是如果有人正在寻找跨平台的解决方案。 –
这取决于你要转换的数据的字节序标记,在关系到您的设备字节序的符号。 wiki on Endianness
要保持它,你需要检查完成两法
NSData *data4 = [completeData subdataWithRange:NSMakeRange(0, 4)];
int value = CFSwapInt32BigToHost(*(int*)([data4 bytes]));
或
NSData *data4 = [completeData subdataWithRange:NSMakeRange(0, 4)];
int value = CFSwapInt32LittleToHost(*(int*)([data4 bytes]));
并检查当您分析数据哪一个更有意义的简单。
根据数据的来源,您可能需要考虑数据的字节顺序。如果数据被创建并且只能在你的代码中传输,那么你会很好,否则你需要知道小/大的字节序。 – Joe
[将NSdata转换为字节并将前n个字节转换为int]可能的重复(http://stackoverflow.com/questions/7330436/converting-nsdata-to-bytes-then-converting-the-first-n- bytes-to-int) –