我有一个函数,它获取一个const char*数据,并遍历的每个字节进行一些位操作,然后将其添加到另一个char数组中,所以基本上一个字节的输入数据应该是4个字节,2个字节应该是8个字节,依此类推,但我没有得到正确的结果,我不确定我在这里是否正确使用了memcpy,如果有任何帮助,将不胜感激
int encryptDataAndSend(const char *logName, const char *data)
{
const int len = strlen(data);
printf("data length: %d n", strlen(data));
char encryptedData[len * 4];
for (uint8_t i = 0; i < len; i++)
{
uint8_t v1 = 255;
uint8_t v2 = 255;
uint8_t v3 = 255;
uint8_t v4 = 255;
char temp[4] = {0};
printf("char is %d n", data[i]);
v1 |= ((data[i] & (1 << 0)) << 2);
v1 |= ((data[i] & (1 << 1)) << 5);
v2 |= ((data[i] & (1 << 2)) << 2);
v2 |= ((data[i] & (1 << 3)) << 5);
v3 |= ((data[i] & (1 << 4)) << 2);
v3 |= ((data[i] & (1 << 5)) << 5);
v4 |= ((data[i] & (1 << 6)) << 2);
v4 |= ((data[i] & (1 << 7)) << 5);
temp[0] = v1;
temp[1] = v2;
temp[2] = v3;
temp[3] = v4;
printf("temp: %s n", temp);
memcpy(encryptedData, temp, strlen(temp));
}
printf("temp var: %s", encryptedData);
const int txBytes = uart_write_bytes(UART_NUM_2, encryptedData, strlen(encryptedData));
ESP_LOGI(logName, "Wrote %d bytes", txBytes);
ESP_LOG_BUFFER_HEX("SENDDATA_TAG", encryptedData, txBytes);
return txBytes;
}
这就是我如何调用函数
encryptDataAndSend(TX_TASK_TAG, "@BF");
有问题
memcpy(encryptedData, temp, strlen(temp));
As temp可能有也可能没有null字符。因此strlen
将是不正确的
也许
memcpy(encryptedData, temp, 4);
是正确的解决方案。
编辑
此外,加密数据需要在循环的每个增量中向前移动
即。
memcpy(encryptedData + 4 * i, temp, 4);
也可能更改
char encryptedData[len * 4];
至
char encryptedData[len * 4 + 1];
然后
encryptedData[len * 4] = 0;
以确保字符串中有一个null字符!