将NSData转换为int

Pra*_*wal 20 iphone objective-c nsdata ipad

我有一个NSData对象,长度是4个字节.这四个字节我从另一个NSData对象中提取,使用,

fourByteData=[completeData subdataWithRange:NSMakeRange(0, 16)];
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是,上面的语句是否会为我提供完整数据的前四个字节.

如果是,那么如何将所有这些字节转换为等效的int.

zap*_*aph 33

268566528是您期望的值还是您期望的528?如果正确的值是528,那么字节顺序是big-endian但是cpu是little-endian,字节需要反转.

所以,如果正确的值应该是528那么:

NSData *data4 = [completeData subdataWithRange:NSMakeRange(0, 4)];
int value = CFSwapInt32BigToHost(*(int*)([data4 bytes]));
Run Code Online (Sandbox Code Playgroud)

另请注意,网络标准顺序是big-endian.


Suh*_*tel 25

该语句将为您提供前16个字节的数据,而不是4.要获得前4个字节,您需要将语句修改为:

fourByteData = [completeData subdataWithRange:NSMakeRange(0, 4)];
Run Code Online (Sandbox Code Playgroud)

要将NSData对象中的数据读取为整数,您可以执行以下操作:

int theInteger;
[completeData getBytes:&theInteger length:sizeof(theInteger)];
Run Code Online (Sandbox Code Playgroud)

如果只是将它转换为整数,则不需要获取前4个字节.您可以直接从上面的两行和completeData接收器执行此操作


Pey*_*loW 12

不,您将获得16个字节的数据,因为范围是从偏移0到16个字节.

如果你有一个NSData4字节的实例,那么你可以像这样做一个简单的类型转换:

int value = *(int*)([data bytes]);
Run Code Online (Sandbox Code Playgroud)


Rub*_*con 5

- (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];
Run Code Online (Sandbox Code Playgroud)