0

当一个字节数组传递给它时,如何在目标 c 中获取一个 32 位数字,类似于在 java 中,

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

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

4

3 回答 3

0

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

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

关于字节序

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

number=ntohl(number);
于 2013-01-15T11:56:48.967 回答
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;
}

如果数字在缓冲区中以大端编码,则使用:

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

更新如果您使用在同一主机上创建的数据,那么字节序不是问题,在这种情况下,您可以使用 aunion作为缓冲区和整数之间的桥梁,从而避免一些不愉快的转换:

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

memcpy(u.b, buffer, sizeof(u.b));
// value is u.i
于 2013-01-15T11:49:59.157 回答
0

根据字节顺序:

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

或者

uint32_t n = b3 << 24 | b2 << 16 | b1 << 8 | b0
于 2013-01-15T11:51:45.590 回答