【问题标题】:how to encode a UInt32 scalar type into a NSData object如何将 UInt32 标量类型编码为 NSData 对象
【发布时间】:2012-02-24 00:48:29
【问题描述】:

我目前正在创建这个 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];

}

【问题讨论】:

    标签: iphone ios nsstring nsdata uint32


    【解决方案1】:

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

    代码如下

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

    【讨论】:

    • 不要那样做。它不是字节顺序安全的(PowerPC Mac 和 Intel Mac 会以不同的方式读取它。)
    • hrmm。那么如何使它成为字节序安全的呢?目前我正在尝试将其设为大端,我已将结果输出到桌面上的 .dat 文件夹并使用 HexEdit 打开它以检查结果,并且它当前将其读取为大端..关于如何我的任何建议可以确保安全。
    • 首先使用CFSwapInt32HostToBig()CFSwapInt32HostToLittle() 将其字节交换为已知顺序。读入时,将生成的整数与CFSwapInt32BigToHost()CFSwapInt32LittleToHost() 适当地交换回本机顺序。
    • 好的,很酷,感谢您的提醒。我将不得不对此进行更多调查。虽然我知道你在说什么,但我只是在做一些 c++ 时才听说过这个
    【解决方案2】:

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

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

    【讨论】:

    • 我计划在每个属性的开头添加一个前导 Uint16 数字,这样当它到达服务器时,服务器可以处理接收器类中的每个部分。你指的是那个吗?唯一的问题是我不确定如何从几个中创建一个 NSData 结构......我目前正在调查。
    • NSData 只是数据。但是你说你想做的是保存不同的对象。无需关注 NSData,只需将对象(NSString 和 NSNumber)保存为属性列表(NSDictionary)中的键值。
    【解决方案3】:

    您可以使用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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 2017-05-12
      • 1970-01-01
      • 2021-06-22
      相关资源
      最近更新 更多