更优雅的替代(*(uint16_t *)[[NSData] bytes])?

时间:2016-07-13 17:39:37

标签: objective-c pointers

我需要字节交换一些表示无符号16位整数的字节。以下代码有效,但似乎有点荒谬:

CFSwapInt16(*(uint16_t*)[[myNSDataVariable] bytes]);

以下是我推断的内容:

[[myNSDataVariable] bytes]返回一个指向字节数组的void指针。

(uint16_t*)将void指针强制转换为uint16_t指针。

最终外*取消引用uint16_t指针,提供对实际uint16_t值的访问权。

是否有更优雅的方式从uint16_t获取NSData值?

3 个答案:

答案 0 :(得分:5)

我会说以下内容更具可读性:

uint16_t *valuePtr = (uint16_t *)[myNSDataVariable bytes];
uint16_t swappedValue = CFSwapInt16(*valuePtr);

但最终你会在某个地方进行这种转换。如果您不止一次这样做,我建议使用一个更清晰的功能:

uint16_t SwappedIntegerFromData(NSData *data) {
    uint16_t *valuePtr = (uint16_t *)[data bytes];
    return CFSwapInt16(*valuePtr);
}

uint16_t value = SwappedIntegerFromData(myNSDataVariable);

但同样,转换必须某处

答案 1 :(得分:3)

不是。

你需要强制转换,以便(Objective-)C知道指针指的是一个2字节的值,你需要间接通过指针访问这2个字节。

如果你真的想要,你可以:

typedef uint16_t *UInt16Ptr;

并投放到UInt16Ptr,如果失去一个*会让你更优雅。您还可以使用点符号处理bytes作为属性。结合这将给你:

CFSwapInt16(*(UInt16Ptr)myNSDataVariable.bytes);

但优雅在旁观者的眼中,有些人会认为我不太优雅。

答案 2 :(得分:-2)

C中的内容更优雅,并且#34;回复邮件":

void  swap_bytes( uint16_t  *p_u )
{
    char  *p_b = (char *) p_u;

    char  saved = 0[ p_u ];
    0[ p_u ]    = 1[ p_u ];
    1[ p_u ]    = saved;
}

你认为我们可以将UINTATHERIUM融入uint16_t吗?也许是新生儿?