每日总结
20240227
1.如何将字符串通过串口以十六进制进行传输
将文件名或者文件内容通过串口传输,再解析,拼接成源文件
1.1 文件转换
1.1.1 转十六进制
在Linux中,你可以使用 xxd
命令将文本文件转换为十六进制格式。以下是如何在Linux中使用 xxd
命令将 demo.tar.gz 文件内容转换为十六进制表示的步骤:
-
打开终端(Terminal)。
-
运行以下命令将 demo.tar.gz 文件内容转换为十六进制:
xxd -p demo.tar.gz
-
如果你希望将转换后的十六进制数据保存到文件中,可以使用重定向操作符
>
将输出写入到一个新文件中,例如:xxd -p demo.tar.gz > demo_hex.txt
这将把 demo.tar.gz 文件内容以十六进制格式写入到 demo_hex.txt 文件中。
通过使用 xxd
命令,你可以方便地在Linux系统中将文件内容转换为十六进制格式。
1.1.2 十六进制反转
xxd -p
命令用于将文件内容转换为十六进制表示,如果要将经过xxd -p
转换后的文件内容恢复成原文件,可以使用xxd -r
命令。
以下是恢复文件的步骤:
- 假设您有一个经过
xxd -p
转换后的十六进制文件demo_hex.txt
,内容类似于以下示例:
48656c6c6f20576f726c6421
- 使用
xxd -r
命令将该十六进制文件内容恢复成原文件。执行以下命令:
xxd -r -p demo_hex.txt > demo.tar.gz
这将把经过十六进制转换的文件内容恢复成二进制形式,并保存为restored_file
文件中。现在,restored_file
中的内容将与原始文件相同。
请确保在恢复文件前备份原始文件,以防数据丢失或损坏。
1.2 文件名转换
1.2.1 转十六进制
如果你只是想将文件名 demo.tar.gz
转换为十六进制表示,你可以使用类似 xxd
的工具来实现。在Linux中,你可以使用 echo -n
命令结合 xxd -p
命令来实现这个目的。以下是在Linux中将文件名转换为十六进制表示的方法:
echo -n "demo.tar.gz" | xxd -p
运行以上命令后,你会得到 demo2e7461722e677a
这样的十六进制表示。这个值可以在需要时用作其他操作的输入或处理。
通过这种方式,你可以在Linux中快速将文件名或任何文本转换为十六进制表示。
1.2.2 十六进制反转
在Linux中,你可以使用 xxd
命令的 -r
选项来将十六进制数据转换回文件名。以下是在Linux中将十六进制字符串转换为文件名的示例:
echo -n "64656d6f2e7461722e677a" | xxd -r -p
上面的命令会将十六进制字符串 64656d6f2e7461722e677a
转换为文件名 demo.tar.gz
。
这样,你就可以使用 echo
结合 xxd -r -p
命令来将十六进制字符串转换为原始的文件名。
1.3 参数意义
在 xxd
命令中,-r
和 -p
分别代表以下含义:
-r
:将十六进制数据转换为其原始形式。-p
:指定输出数据为纯精简的十六进制格式,不包含地址或ASCII表示。
这两个选项的含义如下:
-r
是revert
的缩写,表示将十六进制数据还原为其原始形式。-p
是plain
的缩写,表示输出为纯精简的十六进制格式。
因此,在使用 xxd -r -p
命令时,-r
表示将十六进制数据转换回原始形式,而 -p
则表示输出为纯精简的十六进制格式。
1.4 C语言实现
在C语言中,你可以使用标准库函数来实现将文件名转换为十六进制字符串以及将十六进制字符串转换回文件名的过程。下面分别给出这两个过程的示例代码:
将文件名转换为十六进制字符串
#include <stdio.h>
#include <string.h>
int main() {
const char *filename = "demo.tar.gz";
char hex_string[2 * strlen(filename) + 1]; // 十六进制字符串长度是原始字符串的两倍
int i;
for (i = 0; i < strlen(filename); i++) {
sprintf(&hex_string[i*2], "%02x", filename[i]); // 将每个字符转换为两位十六进制数
}
hex_string[2 * strlen(filename)] = '\0'; // 添加字符串结束符
printf("文件名转换为十六进制字符串:%s\n", hex_string);
return 0;
}
将十六进制字符串转换为文件名
#include <stdio.h>
#include <string.h>
int main() {
const char *hex_string = "64656d6f2e7461722e677a"; // 十六进制字符串
char filename[strlen(hex_string)/2 + 1]; // 文件名长度是十六进制字符串长度的一半
int i;
for (i = 0; i < strlen(hex_string)/2; i++) {
sscanf(&hex_string[i*2], "%2hhx", &filename[i]); // 将每两位十六进制数转换为一个字符
}
filename[strlen(hex_string)/2] = '\0'; // 添加字符串结束符
printf("十六进制字符串转换为文件名:%s\n", filename);
return 0;
}
在这两段代码中,我们使用了 sprintf
函数将文件名转换为十六进制字符串,并使用 sscanf
函数将十六进制字符串转换为文件名。这样就实现了通过C语言实现将文件名转换为十六进制字符串以及将十六进制字符串转换回文件名的功能。