You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 04:55:13