working on bitstring

This commit is contained in:
skarg
2005-04-15 13:36:32 +00:00
parent 095de9d4d1
commit 347c5b4607
+22 -17
View File
@@ -552,16 +552,22 @@ int decode_bitstring(uint8_t * apdu, uint32_t len_value,
int len = 0; int len = 0;
uint8_t unused_bits = 0; uint8_t unused_bits = 0;
uint32_t i = 0; uint32_t i = 0;
uint32_t bytes_used = 0;
bitstring_init(bit_string); bitstring_init(bit_string);
unused_bits = apdu[len++] & 0x07; if (len_value && ((len_value - 1) < MAX_BITSTRING_BYTES))
if (len_value && (len_value < MAX_BITSTRING_BYTES))
{ {
for (i = 0; i < len_value; i++) // the first octet contains the unused bits
bytes_used = len_value--;
len = 1;
for (i = 0; i < bytes_used; i++)
{ {
bit_string->value[i] = apdu[len++]; bit_string->value[i] = apdu[len++];
} }
bit_string->bits_used = (len_value * 8) + (8 - unused_bits) + 1; unused_bits = apdu[0] & 0x07;
bit_string->bits_used = bytes_used * 8;
bit_string->bits_used -= unused_bits;
} }
return len; return len;
@@ -576,9 +582,15 @@ int encode_bitstring(uint8_t * apdu, BACNET_BIT_STRING *bit_string)
uint8_t used_bytes = 0; uint8_t used_bytes = 0;
uint8_t i = 0; uint8_t i = 0;
used_bytes = bit_string->bits_used / 8; // 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); used_bits = bit_string->bits_used - (used_bytes * 8);
apdu[len++] = 8 - used_bits; // if the bit string is empty, then the first octet shall be zero
if (bit_string->bits_used)
apdu[len++] = 8 - used_bits;
else
apdu[len++] = 0;
for (i = 0; i < used_bytes; i++) for (i = 0; i < used_bytes; i++)
{ {
apdu[len++] = bit_string->value[i]; apdu[len++] = bit_string->value[i];
@@ -1481,15 +1493,11 @@ void testBACDCodeBitString(Test * pTest)
{ {
ct_test(pTest, bitstring_bit(&bit_string, bit) == false); ct_test(pTest, bitstring_bit(&bit_string, bit) == false);
} }
// test encode/decode // test encode/decode -- true
for (bit = 0; bit < (MAX_BITSTRING_BYTES*8); bit++) for (bit = 0; bit < (MAX_BITSTRING_BYTES*8); bit++)
{ {
bitstring_set_bit(&bit_string, bit, true); bitstring_set_bit(&bit_string, bit, true);
ct_test(pTest, bitstring_bits_used(&bit_string) == (bit + 1)); ct_test(pTest, bitstring_bits_used(&bit_string) == (bit + 1));
if (bitstring_bits_used(&bit_string) != (bit + 1))
printf("bits used=%u bit number=%u\n",
(unsigned)bitstring_bits_used(&bit_string),
(unsigned)bit);
ct_test(pTest, bitstring_bit(&bit_string, bit) == true); ct_test(pTest, bitstring_bit(&bit_string, bit) == true);
// encode // encode
len = encode_tagged_bitstring(&apdu[0], &bit_string); len = encode_tagged_bitstring(&apdu[0], &bit_string);
@@ -1498,13 +1506,10 @@ void testBACDCodeBitString(Test * pTest)
ct_test(pTest, tag_number == BACNET_APPLICATION_TAG_BIT_STRING); ct_test(pTest, tag_number == BACNET_APPLICATION_TAG_BIT_STRING);
len += decode_bitstring(&apdu[len], len_value,&decoded_bit_string); len += decode_bitstring(&apdu[len], len_value,&decoded_bit_string);
ct_test(pTest, bitstring_bits_used(&decoded_bit_string) == (bit + 1)); ct_test(pTest, bitstring_bits_used(&decoded_bit_string) == (bit + 1));
if (bitstring_bits_used(&decoded_bit_string) != (bit + 1))
printf("bits used=%u bit number=%u\n",
(unsigned)bitstring_bits_used(&decoded_bit_string),
(unsigned)bit);
ct_test(pTest, bitstring_bit(&decoded_bit_string, bit) == true); ct_test(pTest, bitstring_bit(&decoded_bit_string, bit) == true);
} }
// test encode/decode // test encode/decode -- false
bitstring_init(&bit_string);
for (bit = 0; bit < (MAX_BITSTRING_BYTES*8); bit++) for (bit = 0; bit < (MAX_BITSTRING_BYTES*8); bit++)
{ {
bitstring_set_bit(&bit_string, bit, false); bitstring_set_bit(&bit_string, bit, false);