Arduino中C++ String类读取RSA私钥文件格式问题求助
Arduino读取AWS RSA私钥生成分行String的修正方案
常见问题分析
读取后内容错乱、分行失效通常源于以下几点:
- 未正确处理不同系统的换行符(Windows的
\r\n、Linux的\n) - 逐行读取时遗漏换行符,或拼接时未保留分行结构
- 私钥文件的标识校验不严谨,读取了错误内容
修正后的代码示例
以下是基于SD卡读取的完整代码(若使用SPIFFS,只需替换文件操作相关API即可):
#include <SD.h> #include <String.h> String readAWSRSAPrivateKey(const char* filePath) { String privateKey = ""; File keyFile = SD.open(filePath); if (!keyFile) { Serial.println("Failed to open private key file"); return privateKey; } // 逐行读取并保留分行结构 while (keyFile.available()) { String line = keyFile.readStringUntil('\n'); // 移除Windows换行符中的多余\r if (line.endsWith("\r")) { line.remove(line.length() - 1); } // 拼接当前行+标准换行符,保证分行效果 privateKey += line + "\n"; } keyFile.close(); // 校验文件是否包含目标标识 if (privateKey.indexOf("AWS_CERT_PRIVATE") == -1) { Serial.println("Key file missing AWS_CERT_PRIVATE marker"); privateKey.clear(); } return privateKey; } void setup() { Serial.begin(115200); // 初始化SD卡,CS引脚根据硬件调整 if (!SD.begin(4)) { Serial.println("SD card init failed!"); return; } String rsaKey = readAWSRSAPrivateKey("/aws_private_key.txt"); if (rsaKey.length() > 0) { Serial.println("Read RSA private key successfully:"); Serial.println(rsaKey); } } void loop() {}
关键修正点
- 用
readStringUntil('\n')确保每次读取完整一行内容 - 主动处理Windows风格的
\r换行符,避免字符串中出现无效字符 - 拼接时强制添加
\n,严格保留私钥的分行结构 - 增加标识校验逻辑,确保读取的是目标私钥文件
注意事项
- 确保SD卡/SPIFFS初始化正常,文件路径与实际存储位置一致
- 私钥文件需为纯文本格式,无编码乱码或特殊格式标记
- 若私钥体积较大,建议改用
char数组替代String类,避免Arduino内存溢出
内容的提问来源于stack exchange,提问作者enomis
相关产品推荐
相关产品推荐

