在ios中获得32位数

时间:2013-01-15 11:33:07

标签: ios objective-c

如果在传递字节数组时在目标c中获取32位数字,就像在java中一样,

ByteBuffer bb = ByteBuffer.wrap(truncation);   
return bb.getInt();

截断是字节数组。 它返回32位数字。这在目标c中是否可行?

3 个答案:

答案 0 :(得分:0)

如果数字在缓冲区内以little-endian编码,则使用:

int32_t getInt32LE(const uint8_t *buffer)
{
    int32_t value = 0;
    unsigned length = 4;
    while (length > 0)
    {
        value <<= 8;
        value |= buffer[--length];
    }
    return value;
}

如果数字在缓冲区内以big-endian编码,则使用:

int32_t getInt32BE(const uint8_t *buffer)
{
    int32_t value = 0;
    for (unsigned i = 0; i < 4; i++)
    {
        value <<= 8;
        value |= *buffer++;
    }
    return value;
}

更新如果您使用在同一主机上创建的数据,那么字节顺序不是问题,在这种情况下,您可以使用union作为网桥在缓冲区和整数之间,这避免了一些令人不快的演员:

union
{
    uint8_t b[sizeof(int32_t)];
    int32_t i;
} u;

memcpy(u.b, buffer, sizeof(u.b));
// value is u.i

答案 1 :(得分:0)

取决于字节顺序:

uint32_t n = b0 << 24 | b1 << 16 | b2 << 8 | b3;

uint32_t n = b3 << 24 | b2 << 16 | b1 << 8 | b0

答案 2 :(得分:0)

不确定您是否只想读取4个字节并将该值分配给整数。这种情况:

int32_t number;
memcpy(&number, truncation, sizeof(uint32_t));

关于endianess

从您的问题(对我来说)很清楚,字节已经正确排序。但是,如果您必须重新排序这些字节,请在ntohl()之后使用memcpy()

number=ntohl(number);