2012-02-24 24 views
0

我目前正在创建此NSData对象。我想放入不同的NSString和UInt32类型的对象。我知道如何将NSString放入我的NSData对象,但我不知道如何使用UInt32标量类型来完成此操作。如何将UInt32标量类型编码为NSData对象

这是我用做它的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

所以我想通了和的,而不是只更新我的问题,我会放在答案,以便其他人可以看到这个问题已回答如果他们想要做类似的事情。

代码如下

- (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]; 

} 
+2

不要那样做。这不是Endian安全的(PowerPC Mac和Intel Mac将以不同的方式读取它。) – 2012-02-24 01:28:51

+0

hrmm。那么,如何让它在endian安全?目前我正在努力使它成为big-endian,我已经将结果输出到桌面上的.dat文件夹中,并用HexEdit打开以检查结果,并且当前将其作为大端序列读取。可以使这个安全。 – 2012-02-24 01:48:47

+2

首先使用'CFSwapInt32HostToBig()'或'CFSwapInt32HostToLittle()'将字节交换为已知顺序。读入时,根据需要使用'CFSwapInt32BigToHost()'或'CFSwapInt32LittleToHost()'交换生成的整数。 – 2012-02-24 15:02:47

1

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

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

+0

我打算在每个属性的开始添加一个领先的Uint16数字,所以当它使其服务器可以处理reciver类中的每个部分。那是你所指的?唯一的问题是,我不确定如何创建一个NSData结构中的几个...即时调查目前。 – 2012-02-24 01:47:08

+0

NSData只是数据。但是你说你想要做的是保存不同的对象。不要只关注NSData,只需将对象(NSString和NSNumber)保存为属性列表(NSDictionary)中的键控值即可。 – 2012-02-29 17:50:44

0

您可以使用htonl()htons(),ntohl()ntohs()使其保持endian安全。

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> 
相关问题