Вы бы сами соединили байты в целое число.
Если вы находитесь на хосте с прямым порядком байтов и ваш текущий код получил правильное целочисленное значение, используйте это:
/** De-serialize a uint64_t from a byte array in big endian format.
* @param r The byte array to containing the integer in. Must be at least of size 4.
* @param return The deserialized integer from the byte array
*/
static inline uint64_t uc_unpack_64_be(const uint8_t *r)
{
uint64_t v;
v = (uint64_t)r[0] << 56;
v |= (uint64_t)r[1] << 48;
v |= (uint64_t)r[2] << 40;
v |= (uint64_t)r[3] << 32;
v |= (uint32_t)r[4] << 24;
v |= r[5] << 16;
v |= r[6] << 8;
v |= r[7];
return v;
}
Если вы в данный момент находитесь на машине с прямым порядком байтов, используйте эту:
/** De-serialize a uint64_t from a byte array in little endian format.
* @param r The byte array to containing the integer in. Must be at least of size 8.
* @param return The deserialized integer from the byte array
*/
static inline uint64_t uc_unpack_64_le(const uint8_t *r)
{
uint64_t v;
v = r[0];
v |= r[1] << 8;
v |= r[2] << 16;
v |= (uint32_t)r[3] << 24;
v |= (uint64_t)r[4] << 32;
v |= (uint64_t)r[5] << 40;
v |= (uint64_t)r[6] << 48;
v |= (uint64_t)r[7] << 56;
return v;
}
Используйте его, например. as uint64_t myqword = uc_unpack_64_le (& buffer [16]);
Обратите внимание, что то, используете ли вы одну из uint64_t uc_unpack_64_le
или uint64_t uc_unpack_64_le
функций, зависит от того, отформатировали ли вы данные в вашем buffer
как с прямым или младшим порядком байтов, а не от того, работает ли ваш код на машине с прямым или младшим порядком байтов.
Если вы настаиваете на том, чтобы использовать текущие типы long и char, измените код соответствующим образом, но я рекомендую вместо этого использовать типы uint16_t и uint64_t из заголовка <stdint.h>
.