Skip to content

Commit

Permalink
add tk_bits_data_to_bytes_data/tk_bits_data_from_bytes_data
Browse files Browse the repository at this point in the history
  • Loading branch information
xianjimli committed Feb 7, 2024
1 parent 11f1764 commit 3c330e7
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 7 deletions.
3 changes: 3 additions & 0 deletions docs/changes.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# 最新动态

2024/02/07
* 增加函数tk\_bits\_data\_to\_bytes\_data/tk\_bits\_data\_from\_bytes\_data

2024/02/05
* 修复点击复制出来的scroll\_bar\_d控件的空白处会崩溃的问题(感谢培煌提供补丁)

Expand Down
24 changes: 24 additions & 0 deletions src/tkc/utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -2139,3 +2139,27 @@ uint32_t tk_bits_to_bytes(uint32_t bits) {
return (bits + 7) / 8;
}

ret_t tk_bits_data_from_bytes_data(uint8_t* bits, uint32_t bits_size, uint8_t* bytes,
uint32_t bytes_size) {
uint32_t i = 0;

for (i = 0; i < bytes_size; i++) {
bits_stream_set(bits, bits_size, i, bytes[i] != 0);
}

return RET_OK;
}

ret_t tk_bits_data_to_bytes_data(uint8_t* bits, uint32_t bits_size, uint8_t* bytes,
uint32_t bytes_size) {
uint32_t i = 0;
for (i = 0; i < bytes_size; i++) {
bool_t value = FALSE;

if (bits_stream_get(bits, bits_size, i, &value) == RET_OK) {
bytes[i] = value ? 1 : 0;
}
}

return RET_OK;
}
26 changes: 25 additions & 1 deletion src/tkc/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -1135,12 +1135,36 @@ ret_t tk_date_time_format(uint64_t time, const char* format, str_t* result);

/**
* @method tk_bits_to_bytes
* 将bits转换成bytes
* 将bits数转换成bytes数
* @param {uint32_t} bits bits。
* @return {uint32_t} 返回bytes。
*/
uint32_t tk_bits_to_bytes(uint32_t bits);

/**
* @method tk_bits_data_from_bytes_data
* 将bytes数据转换成bits数据(每个字节对应一位)。
* @param {uint8_t*} bits bits。
* @param {uint32_t} bits_size bits内存的长度(字节数)。
* @param {uint8_t*} bytes bytes。
* @param {uint32_t} bytes_size bytes内存的长度(字节数)。
* @return {ret_t} 返回RET_OK表示成功,否则表示失败。
*/
ret_t tk_bits_data_from_bytes_data(uint8_t* bits, uint32_t bits_size, uint8_t* bytes,
uint32_t bytes_size);

/**
* @method tk_bits_data_to_bytes_data
* 将bits数据转换成bytes数据(每个字节对应一位)。
* @param {uint8_t*} bits bits。
* @param {uint32_t} bits_size bits内存的长度(字节数)。
* @param {uint8_t*} bytes bytes。
* @param {uint32_t} bytes_size bytes内存的长度(字节数)。
* @return {ret_t} 返回RET_OK表示成功,否则表示失败。
*/
ret_t tk_bits_data_to_bytes_data(uint8_t* bits, uint32_t bits_size, uint8_t* bytes,
uint32_t bytes_size);

#define TK_STRDUP(str) ((str) != NULL) ? tk_strdup(str) : NULL
#define TK_STRNDUP(str, len) ((str) != NULL) ? tk_strndup(str, len) : NULL

Expand Down
34 changes: 28 additions & 6 deletions tests/utils_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1200,22 +1200,22 @@ TEST(Utils, tk_date_time_format) {
str_attach(&str, buff, sizeof(buff));
ASSERT_EQ(tk_date_time_format(0, "", &str), RET_OK);
ASSERT_STREQ(str.str, "");

ASSERT_EQ(tk_date_time_format(0, "Y", &str), RET_OK);
ASSERT_STREQ(str.str, "1970");

ASSERT_EQ(tk_date_time_format(0, "Y-M-D", &str), RET_OK);
ASSERT_STREQ(str.str, "1970-1-1");

ASSERT_EQ(tk_date_time_format(0, "Y-M-D h:m:s", &str), RET_OK);
ASSERT_STREQ(str.str, "1970-1-1 0:0:0");

ASSERT_EQ(tk_date_time_format(0, "YY", &str), RET_OK);
ASSERT_STREQ(str.str, "70");

ASSERT_EQ(tk_date_time_format(0, "YY-MM-DD", &str), RET_OK);
ASSERT_STREQ(str.str, "70-01-01");

ASSERT_EQ(tk_date_time_format(0, "YY-MM-DD hh:mm:ss", &str), RET_OK);
ASSERT_STREQ(str.str, "70-01-01 00:00:00");

Expand Down Expand Up @@ -1253,3 +1253,25 @@ TEST(Utils, alpha) {
ASSERT_EQ(tk_isalpha(' '), FALSE);
}

TEST(Utils, bits_data_byte_data) {
uint16_t data = 0;
uint8_t output[16];
uint8_t bytes[16] = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1};
uint8_t* bits = (uint8_t*)&data;

memset(output, 0, sizeof(output));
ASSERT_EQ(tk_bits_data_from_bytes_data(bits, sizeof(data), bytes, 2), RET_OK);
ASSERT_EQ(data, 0x02);
ASSERT_EQ(tk_bits_data_to_bytes_data(bits, sizeof(data), output, 2), RET_OK);
ASSERT_EQ(memcmp(output, bytes, 2), 0);

ASSERT_EQ(tk_bits_data_from_bytes_data(bits, sizeof(data), bytes, 8), RET_OK);
ASSERT_EQ(data, 0x0aa);
ASSERT_EQ(tk_bits_data_to_bytes_data(bits, sizeof(data), output, 8), RET_OK);
ASSERT_EQ(memcmp(output, bytes, 8), 0);

ASSERT_EQ(tk_bits_data_from_bytes_data(bits, sizeof(data), bytes, sizeof(bytes)), RET_OK);
ASSERT_EQ(data, 0xaaaa);
ASSERT_EQ(tk_bits_data_to_bytes_data(bits, sizeof(data), output, 16), RET_OK);
ASSERT_EQ(memcmp(output, bytes, 16), 0);
}

0 comments on commit 3c330e7

Please sign in to comment.