Added ascii-hex conversion in the octet-string library to allow ascii-hex to be parsed correctly from demo applications.

This commit is contained in:
skarg
2011-09-17 04:21:32 +00:00
parent a9e752d64d
commit 120c2734ee
3 changed files with 58 additions and 3 deletions
+8 -1
View File
@@ -162,7 +162,14 @@ extern "C" {
BACNET_OCTET_STRING * octet_string,
uint8_t * value,
size_t length);
bool octetstring_copy(
#ifdef PRINT_ENABLED
/* converts an null terminated ASCII Hex string to an octet string.
returns true if successfully converted and fits; false if too long */
bool octetstring_init_ascii_hex(
BACNET_OCTET_STRING * octet_string,
const char * ascii_hex);
#endif
bool octetstring_copy(
BACNET_OCTET_STRING * dest,
BACNET_OCTET_STRING * src);
/* returns false if the string exceeds capacity */
+3 -2
View File
@@ -45,6 +45,7 @@
#include "bacapp.h"
#include "bactext.h"
#include "datetime.h"
#include "bacstr.h"
/** @file bacapp.c Utilities for the BACnet_Application_Data_Value */
@@ -1188,8 +1189,8 @@ bool bacapp_parse_application_data(
#endif
case BACNET_APPLICATION_TAG_OCTET_STRING:
status =
octetstring_init(&value->type.Octet_String,
(uint8_t *) argv, strlen(argv));
octetstring_init_ascii_hex(&value->type.Octet_String,
argv);
break;
case BACNET_APPLICATION_TAG_CHARACTER_STRING:
status =
+47
View File
@@ -35,6 +35,10 @@
#include <stdbool.h>
#include <stdint.h>
#include <string.h> /* for strlen */
#ifdef PRINT_ENABLED
#include <stdlib.h> /* for strtol */
#include <ctype.h> /* for isalnum */
#endif
#include "config.h"
#include "bacstr.h"
#include "bits.h"
@@ -641,6 +645,49 @@ bool octetstring_init(
return status;
}
#ifdef PRINT_ENABLED
/* converts an null terminated ASCII Hex string to an octet string.
returns true if successfully converted and fits; false if too long */
bool octetstring_init_ascii_hex(
BACNET_OCTET_STRING * octet_string,
const char * ascii_hex)
{
bool status = false; /* return value */
unsigned index = 0; /* offset into buffer */
uint8_t value = 0;
char hex_pair_string[3] = "";
if (octet_string) {
octet_string->length = 0;
while (ascii_hex[index] != 0) {
if (!isalnum(ascii_hex[index])) {
/* skip non-numeric or alpha */
index++;
continue;
}
if (ascii_hex[index+1] == 0) {
break;
}
hex_pair_string[0] = ascii_hex[index];
hex_pair_string[1] = ascii_hex[index+1];
value = (uint8_t)strtol(hex_pair_string, NULL, 16);
if (octet_string->length <= MAX_OCTET_STRING_BYTES) {
octet_string->value[octet_string->length] = value;
octet_string->length++;
status = true;
} else {
break;
status = false;
}
/* set up for next pair */
index += 2;
}
}
return status;
}
#endif
bool octetstring_copy(
BACNET_OCTET_STRING * dest,
BACNET_OCTET_STRING * src)