【问题标题】:memcpy from Byte * to unsigned int Is Reversing Byte Order从 Byte * 到 unsigned int 的 memcpy 正在反转字节顺序
【发布时间】:2013-06-30 09:11:34
【问题描述】:

我有一个CFBitVector,看起来像'100000000000000' 我将字节数组传递给CFBitVectorGetBits,然后它包含来自此CFBitVector 的值。在这个电话之后,bytes[2] 看起来像:

bytes[0] == '0x80'
bytes[1] == '0x00'

这正是我所期望的。但是,当将bytes[2] 的内容复制到unsigned int bytesValue, 时,值应该是128,而它应该是32768。十进制值128 由十六进制值0x0080 表示。本质上,执行memcpy 时似乎字节顺序颠倒了。这里发生了什么?这只是字节顺序的问题吗?

谢谢

CFMutableBitVectorRef bitVector = CFBitVectorCreateMutable(kCFAllocatorDefault, 16);
CFBitVectorSetCount(bitVector, 16);

CFBitVectorSetBitAtIndex(bitVector, 0, 1);

CFRange range = CFRangeMake(0, 16);
Byte bytes[2] = {0,0};
unsigned int bytesValue = 0;

CFBitVectorGetBits(bitVector, range, bytes);
memcpy(&bytesValue, bytes, sizeof(bytes));

return bytesValue;

【问题讨论】:

    标签: c++ objective-c memory endianness memcpy


    【解决方案1】:

    这里发生了什么?这只是字节顺序的问题吗?

    是的。

    你的电脑是小端的。 16 位值 32768 在内存中表示为:

    00 80
    

    在一个小端机器上。你有:

    80 00
    

    正好相反,如您所见,代表 128。

    【讨论】:

    • 在决定如何处理字节值之前,我是否应该测试机器的字节顺序?这似乎不是一个公平的解决方案。
    • 好吧,如果需要,您可以通过在其中使用ntohsntohl 调用将测试推送到系统。 “公平”是什么意思?
    • Mac和iOS平台还有OSSwapLittleToHostInt16()等相关方法。
    • 如果想直接处理组成int 的字节,那么你将不得不处理字节序问题。你可以抱怨“公平”,但这只是问题的本质。
    • 感谢大家的回复。 htons 似乎很适合这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    相关资源
    最近更新 更多