我需要字节交换一些表示无符号16位整数的字节。以下代码有效,但似乎有点荒谬:
CFSwapInt16(*(uint16_t*)[[myNSDataVariable] bytes]);
以下是我推断的内容:
[[myNSDataVariable] bytes]
返回一个指向字节数组的void指针。
(uint16_t*)
将void指针强制转换为uint16_t
指针。
最终外*
取消引用uint16_t
指针,提供对实际uint16_t
值的访问权。
是否有更优雅的方式从uint16_t
获取NSData
值?
答案 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吗?也许是新生儿?