如何将UInt32标量类型编码为NSData对象

时间:2012-02-24 00:48:30

标签: iphone ios nsstring nsdata uint32

我目前正在创建此NSData对象。我想在服务器中放入NSString和UInt32类型的不同对象。我知道如何将NSString放入我的NSData对象,但我不知道如何使用UInt32标量类型。

这是我使用NSString

的方式
- (void) constructRequest
{
    NSString *mystring = [[NSString alloc] initWithString:[self addMethodName]];
    UInt32 protocolInt = [self addProtocolVersion];

    NSData* data=[mystring dataUsingEncoding:NSUTF8StringEncoding];
    [data writeToFile:@"/Users/imac/Desktop/_dataDump.dat" atomically:YES];

}

3 个答案:

答案 0 :(得分:3)

所以我已经弄明白了,而不仅仅是更新我的问题,我会提出答案,以便其他人可以看到,如果他们想要做类似的事情,这个问题已得到解答。

代码如下

- (void) constructRequest
{
    //NSString *mystring = [[NSString alloc] initWithString:[self addMethodName]];
    UInt32 protocolInt = [self addProt];

    NSData * data = [[NSData alloc] initWithBytes:&protocolInt length:sizeof(protocolInt)];

    //NSData* data=[mystring dataUsingEncoding:NSUTF8StringEncoding];
    [data writeToFile:@"/Users/imac/Desktop/_dataDump.dat" atomically:YES];

}

答案 1 :(得分:1)

是否需要NSData?您可以使用NSString或NSNumber(两者都可以保存在属性列表中)。

如果重要的话,你的方案并没有真正区分4字节字符串和UInt32。

答案 2 :(得分:0)

您可以使用htonl()htons()ntohl()ntohs()来确保端点安全。

 htonl()--"Host to Network Long int"     32Bytes
 ntohl()--"Network to Host Long int"     32Bytes
 htons()--"Host to Network Short int"   16Bytes
 ntohs()--"Network to Host Short int"   16Bytes

示例:

- (void)testExample {

UInt32 length = 0x1a2b3c4d;
NSLog(@"%x", length);
length = htonl(length);
NSLog(@"%x", length);
NSMutableData *data = [[NSMutableData alloc] init];
[data appendBytes:&length length:4];
NSLog(@"%@", data);

}

打印:

2015-10-29 15:46:49.224 UPHTTP-iOS[3896:101301] 1a2b3c4d
2015-10-29 15:46:49.224 UPHTTP-iOS[3896:101301] 4d3c2b1a
2015-10-29 15:46:49.224 UPHTTP-iOS[3896:101301] <1a2b3c4d>