如果在传递字节数组时在目标c中获取32位数字,就像在java中一样,
ByteBuffer bb = ByteBuffer.wrap(truncation);
return bb.getInt();
截断是字节数组。 它返回32位数字。这在目标c中是否可行?
答案 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);