Skip to content

Commit b889553

Browse files
authored
Merge pull request #50 from Zondax/fix_hex2str
Fix hex2str
2 parents c606ed1 + a7d2b8d commit b889553

3 files changed

Lines changed: 61 additions & 7 deletions

File tree

include/zxformat.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ extern "C" {
2121

2222
#include "zxmacros.h"
2323
#include "zxerror.h"
24-
#include "stdlib.h"
2524

2625
#define IS_PRINTABLE(c) (c >= 0x20 && c <= 0x7e)
2726

@@ -309,11 +308,11 @@ __Z_INLINE uint32_t hexstr_to_array(uint8_t *dst, uint16_t dstLen, const char *s
309308
}
310309

311310
for (size_t i = 0; i < srcLen/2; i++) {
312-
char byte_string[3];
313-
byte_string[0] = src[i*2];
314-
byte_string[1] = src[i*2 + 1];
315-
byte_string[2] = '\0';
316-
dst[i] = (uint8_t) strtol(byte_string, NULL, 16);
311+
uint8_t ch0 = src[2 * i];
312+
uint8_t ch1 = src[2 * i + 1];
313+
uint8_t nib0 = (ch0 & 0xF) + (ch0 >> 6) | ((ch0 >> 3) & 0x8);
314+
uint8_t nib1 = (ch1 & 0xF) + (ch1 >> 6) | ((ch1 >> 3) & 0x8);
315+
dst[i] = (nib0 << 4) | nib1;
317316
}
318317

319318
return srcLen/2;

include/zxversion.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@
1717

1818
#define ZXLIB_MAJOR 16
1919
#define ZXLIB_MINOR 0
20-
#define ZXLIB_PATCH 1
20+
#define ZXLIB_PATCH 2

tests/zxformat.cpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,4 +94,59 @@ namespace {
9494
EXPECT_STREQ(buffer, "ERR???");
9595
}
9696

97+
TEST(FORMAT, array2hexstr_1) {
98+
uint8_t s[] = {0x12,0x34,0x56,0x78};
99+
char data[10];
100+
101+
auto length = array_to_hexstr(data, sizeof(data), s, sizeof(s));
102+
103+
EXPECT_STREQ(data, "12345678");
104+
}
105+
106+
TEST(FORMAT, array2hexstr_2) {
107+
uint8_t s[] = {0xFA, 0x5D, 0x34, 0x87};
108+
char data[10];
109+
110+
auto length = array_to_hexstr(data, sizeof(data), s, sizeof(s));
111+
112+
EXPECT_STREQ(data, "FA5D3487");
113+
}
114+
115+
TEST(FORMAT, array2hexstr_small_buffer) {
116+
uint8_t s[] = {0xFA, 0x5D, 0x34, 0x87};
117+
char data[4];
118+
119+
EXPECT_EQ(0, array_to_hexstr(data, sizeof(data), s, sizeof(s)));
120+
}
121+
122+
TEST(FORMAT, hexstr2array_1) {
123+
char s[] = "12345678";
124+
uint8_t data[20];
125+
126+
auto length = hexstr_to_array(data, sizeof(data), s, strlen(s));
127+
128+
ASSERT_THAT(data[0], testing::Eq(0x12));
129+
ASSERT_THAT(data[1], testing::Eq(0x34));
130+
ASSERT_THAT(data[2], testing::Eq(0x56));
131+
ASSERT_THAT(data[3], testing::Eq(0x78));
132+
}
133+
134+
TEST(FORMAT, hexstr2array_2) {
135+
char s[] = "FA2345DE";
136+
uint8_t data[10];
137+
138+
auto length = hexstr_to_array(data, sizeof(data), s, strlen(s));
139+
140+
ASSERT_THAT(data[0], testing::Eq(0xFA));
141+
ASSERT_THAT(data[1], testing::Eq(0x23));
142+
ASSERT_THAT(data[2], testing::Eq(0x45));
143+
ASSERT_THAT(data[3], testing::Eq(0xDE));
144+
}
145+
146+
TEST(FORMAT, hexstr2array_odd_value) {
147+
char s[] = "FA2345DEA";
148+
uint8_t data[10];
149+
150+
EXPECT_EQ(0, hexstr_to_array(data, sizeof(data), s, strlen(s)));
151+
}
97152
}

0 commit comments

Comments
 (0)