From a58d07406abe4adcdec00117c0c1b58529ca809e Mon Sep 17 00:00:00 2001 From: skarg Date: Fri, 15 Apr 2005 15:30:21 +0000 Subject: [PATCH] Corrected the encoding and decoding of the bit string. --- bacnet-stack/bacdcode.c | 66 ++++++++++++++++++++++++++------------ bacnet-stack/bacdcode.ide | Bin 31878 -> 32336 bytes 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/bacnet-stack/bacdcode.c b/bacnet-stack/bacdcode.c index 9059e25d..23257a26 100644 --- a/bacnet-stack/bacdcode.c +++ b/bacnet-stack/bacdcode.c @@ -553,14 +553,16 @@ int decode_bitstring(uint8_t * apdu, uint32_t len_value, uint8_t unused_bits = 0; uint32_t i = 0; uint32_t bytes_used = 0; - + bitstring_init(bit_string); - if (len_value && ((len_value - 1) < MAX_BITSTRING_BYTES)) + if (len_value) { - // the first octet contains the unused bits - bytes_used = len_value--; - len = 1; + // the first octet contains the unused bits + bytes_used = len_value - 1; + if (bytes_used <= MAX_BITSTRING_BYTES) + { + len = 1; for (i = 0; i < bytes_used; i++) { bit_string->value[i] = apdu[len++]; @@ -568,32 +570,53 @@ int decode_bitstring(uint8_t * apdu, uint32_t len_value, unused_bits = apdu[0] & 0x07; bit_string->bits_used = bytes_used * 8; bit_string->bits_used -= unused_bits; + } } - + return len; } +// returns the number of bytes that a bit string is using +static int bitstring_bytes_used(BACNET_BIT_STRING *bit_string) +{ + int len = 0; // return value + uint8_t used_bytes = 0; + uint8_t last_bit = 0; + + if (bit_string->bits_used) + { + last_bit = bit_string->bits_used - 1; + used_bytes = last_bit / 8; + // add one for the first byte + used_bytes++; + len = used_bytes; + } + + return len; +} + // from clause 20.2.10 Encoding of a Bit String Value // returns the number of apdu bytes consumed int encode_bitstring(uint8_t * apdu, BACNET_BIT_STRING *bit_string) { int len = 0; - uint8_t used_bits = 0; + uint8_t remaining_used_bits = 0; uint8_t used_bytes = 0; - uint8_t i = 0; + uint8_t i = 0; - // possible to encode an empty bit string - if (bit_string->bits_used) - used_bytes = (bit_string->bits_used / 8) + 1; - used_bits = bit_string->bits_used - (used_bytes * 8); // if the bit string is empty, then the first octet shall be zero - if (bit_string->bits_used) - apdu[len++] = 8 - used_bits; - else + if (bit_string->bits_used == 0) apdu[len++] = 0; - for (i = 0; i < used_bytes; i++) + else { - apdu[len++] = bit_string->value[i]; + used_bytes = bitstring_bytes_used(bit_string); + remaining_used_bits = bit_string->bits_used - ((used_bytes - 1) * 8); + // number of unused bits in the subsequent final octet + apdu[len++] = 8 - remaining_used_bits; + for (i = 0; i < used_bytes; i++) + { + apdu[len++] = bit_string->value[i]; + } } return len; @@ -602,10 +625,13 @@ int encode_bitstring(uint8_t * apdu, BACNET_BIT_STRING *bit_string) int encode_tagged_bitstring(uint8_t * apdu, BACNET_BIT_STRING *bit_string) { int len = 0; + int bit_string_encoded_length = 1;// 1 for the bits remaining octet - // assumes that the tag only consumes 1 octet - len = encode_bitstring(&apdu[1], bit_string); - len += encode_tag(&apdu[0], BACNET_APPLICATION_TAG_BIT_STRING, false, len); + // bit string may use more than 1 octet for the tag, so find out how many + bit_string_encoded_length += bitstring_bytes_used(bit_string); + len = encode_tag(&apdu[0], BACNET_APPLICATION_TAG_BIT_STRING, false, + bit_string_encoded_length); + len += encode_bitstring(&apdu[len], bit_string); return len; } diff --git a/bacnet-stack/bacdcode.ide b/bacnet-stack/bacdcode.ide index a8471ad12b972cd7f328d0f5fcab0ec18fa904f5..17a9cc30bb06a06dcf63812b75887f135278edd1 100644 GIT binary patch delta 5849 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 w-Kkvoqb18E4