当一个字节数组传递给它时,如何在目标 c 中获取一个 32 位数字,类似于在 java 中,
ByteBuffer bb = ByteBuffer.wrap(truncation);
return bb.getInt();
其中截断是字节数组。它返回 32 位数字。这在目标 c 中可能吗?
当一个字节数组传递给它时,如何在目标 c 中获取一个 32 位数字,类似于在 java 中,
ByteBuffer bb = ByteBuffer.wrap(truncation);
return bb.getInt();
其中截断是字节数组。它返回 32 位数字。这在目标 c 中可能吗?
不确定您是否只想读取 4 个字节并将该值分配给一个整数。这个案例:
int32_t number;
memcpy(&number, truncation, sizeof(uint32_t));
关于字节序
从你的问题(对我来说)很明显字节已经正确排序。但是,如果您必须重新排序这些字节,请使用ntohl()
after memcpy()
:
number=ntohl(number);
如果数字在缓冲区内以 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
根据字节顺序:
uint32_t n = b0 << 24 | b1 << 16 | b2 << 8 | b3;
或者
uint32_t n = b3 << 24 | b2 << 16 | b1 << 8 | b0