From f0c727ff29ca002b7451bab8e9db809c46feda12 Mon Sep 17 00:00:00 2001 From: skarg Date: Sun, 1 Jan 2017 05:12:59 +0000 Subject: [PATCH] Added functions to encode/decode unsigned64 values. --- bacnet-stack/include/bacint.h | 11 +++++++- bacnet-stack/src/bacint.c | 48 +++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/bacnet-stack/include/bacint.h b/bacnet-stack/include/bacint.h index 7fa0bc41..902efa95 100644 --- a/bacnet-stack/include/bacint.h +++ b/bacnet-stack/include/bacint.h @@ -51,7 +51,11 @@ extern "C" { int decode_unsigned32( uint8_t * apdu, uint32_t * value); - +#ifdef UINT64_MAX + int decode_unsigned64( + uint8_t * buffer, + uint64_t * value); +#endif /* signed value encoding and decoding */ int encode_signed8( uint8_t * apdu, @@ -77,6 +81,11 @@ extern "C" { int decode_signed32( uint8_t * apdu, int32_t * value); +#ifdef UINT64_MAX + int encode_unsigned64( + uint8_t * buffer, + uint64_t value); +#endif #ifdef TEST #include "ctest.h" diff --git a/bacnet-stack/src/bacint.c b/bacnet-stack/src/bacint.c index 346076d3..242338eb 100644 --- a/bacnet-stack/src/bacint.c +++ b/bacnet-stack/src/bacint.c @@ -113,6 +113,54 @@ int decode_unsigned32( return 4; } +#ifdef UINT64_MAX +/** + * @brief Encode a 64-bit unsigned value into buffer + * @param buffer - pointer to bytes for storing encoding + * @param value - 16-bit value to encode + * @return Returns the number of bytes encoded + */ +int encode_unsigned64( + uint8_t * buffer, + uint64_t value) +{ + buffer[0] = (uint8_t) ((value & 0xff00000000000000) >> 56); + buffer[1] = (uint8_t) ((value & 0x00ff000000000000) >> 48); + buffer[2] = (uint8_t) ((value & 0x0000ff0000000000) >> 40); + buffer[3] = (uint8_t) ((value & 0x000000ff00000000) >> 32); + buffer[4] = (uint8_t) ((value & 0x00000000ff000000) >> 24); + buffer[5] = (uint8_t) ((value & 0x0000000000ff0000) >> 16); + buffer[6] = (uint8_t) ((value & 0x000000000000ff00) >> 8); + buffer[7] = (uint8_t) (value & 0x00000000000000ff); + + return 8; +} + +/** + * @brief Decode a 64-bit unsigned value from a buffer + * @param buffer - pointer to bytes for used for decoding + * @param value - pointer to 64-bit value to store the decoded value + * @return Returns the number of bytes decoded + */ +int decode_unsigned64( + uint8_t * buffer, + uint64_t * value) +{ + if (value) { + *value = ((uint64_t) ((((uint64_t) buffer[0]) << 56) & 0xff00000000000000)); + *value |= ((uint64_t) ((((uint64_t) buffer[1]) << 48) & 0x00ff000000000000)); + *value |= ((uint64_t) ((((uint64_t) buffer[2]) << 40) & 0x0000ff0000000000)); + *value |= ((uint64_t) ((((uint64_t) buffer[3]) << 32) & 0x000000ff00000000)); + *value |= ((uint64_t) ((((uint64_t) buffer[4]) << 24) & 0x00000000ff000000)); + *value |= ((uint64_t) ((((uint64_t) buffer[5]) << 16) & 0x0000000000ff0000)); + *value |= ((uint64_t) ((((uint64_t) buffer[6]) << 8) & 0x000000000000ff00)); + *value |= ((uint64_t) (((uint64_t) buffer[7]) & 0x00000000000000ff)); + } + + return 8; +} +#endif + #if BACNET_USE_SIGNED int encode_signed8( uint8_t * apdu,