美文网首页
iOS中int与NSData互转以及大小端模式

iOS中int与NSData互转以及大小端模式

作者: 笑笑爸比 | 来源:发表于2017-06-15 17:44 被阅读241次

    一、起因

    在使用Socket编程发送包头给服务器时,需要把int类型数据包装成NSData类型。

    二、方案

    • 方案1(调用系统API-推荐)
    // OC版
    // int转NSData
    int a = 123;
    NSData *data = [NSData dataWithBytes:&a length:sizeof(a)];
    // NSData转int
    int b = 0;
    [data getBytes:&b length:sizeof(a)];
    
    // Swift版
    var a : Int = 123
    let data = NSData(bytes: &a, length: 4)
    var b : Int = 0
    data.getBytes(&b, length: 4)
    
    • 方案2(字符串中转-效率差)
    int num1 = 123;
    NSString *str1 = [NSString stringWithFormat:@"%d", num1];
    NSData *data = [str1 dataUsingEncoding:NSUTF8StringEncoding];
    NSString *str2 = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    int num2 = (int)[str2 integerValue];
    
    • 方案3(自定义方法-有问题)
    // NSData转int
    - (int)data2Int:(NSData *)data{
        Byte *byte = (Byte *)[data bytes];
        // 有大小端模式问题?
         return (byte[0] << 24) + (byte[1] << 16) + (byte[2] << 8) + (byte[3]); 
    }
    
    // int转NSData
    - (NSData *)int2Data:(int)i{
        Byte b0 = i & 0xff;
        Byte b1 = i >> 8 & 0xff;
        Byte b2 = i >> 16 & 0xff;
        Byte b3 = i >> 24 & 0xff;
        // 有大小端模式问题?
        Byte result[] = {b0, b1, b2, b3};
        return [NSData dataWithBytes:result length:sizeof(result)];
    }
    
    

    三、附:大小端模式

    • 名词解释
    大端模式:是指数据的高字节保存在内存的低地址中,而低子节数据保存在内存的高地址中。
    小端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。
    
    • 为什么会有大小端模式?
    处理器(例如32位或者64位的cpu)的发展。
    ARM芯片(iPhone)默认采用小端。
    
    • 验证代码

    验证方式1:(强转)

    short int a = 0x1122;     // 十进制为4386,其中11称为高子节(即15~8位)。
    char b = ((char *)&a)[0]; // 取变量a的低子节(即7~0位)
    printf("%x", b);          // 输出22代表编译器为小端模式
    

    验证方式2:(便于理解)

    int num = 0x12123678;                   // 十进制为305419896
    char a = num & 0xff;                    // 取(0 ~ 7位)一个子节
    char b = num >> 8 & 0xff;               // 取(8 ~15位)一个子节
    char c = num >> 16 & 0xff;              // 取(16~23位)一个子节
    char d = num >> 24 & 0xff;              // 取(24~31位)一个子节
    printf("%x, %x, %x, %x", a, b, c, d);   // 小端模式将输出78,56,34,12
    

    验证方式3:(利用共同体特性)

    代码参考下面推荐的文章(嵌入式)
    
    • 文章推荐
    《详解大端模式和小端模式》
    http://blog.csdn.net/ce123_zhouwei/article/details/6971544
    

    相关文章

      网友评论

          本文标题:iOS中int与NSData互转以及大小端模式

          本文链接:https://www.haomeiwen.com/subject/fgjuqxtx.html