aarch64 GNU/Linux平台JSON字符串读取截断问题排查与修复求助
问题分析
你遇到的问题是aarch64架构下提取的signature字符串长度正确,但cout输出截断,签名验证失败,而x86_64平台正常。核心原因大概率是字符串中混入了不可打印控制字符(比如\0空字符),导致输出被截断,或者旧版Jsoncpp解析器在aarch64下存在兼容性bug。
解决方案
方案1:先排查字符串中的异常字符
添加代码遍历字符串的每个字符,打印其ASCII值和可见形式,确认是否存在不可打印字符:
// 遍历字符串,检查每个字符的ASCII值 std::cout << "Character breakdown:\n"; for (size_t i = 0; i < signature.size(); ++i) { unsigned char c = static_cast<unsigned char>(signature[i]); std::cout << "[" << i << "] '" << (isprint(c) ? c : '.') << "' (0x" << std::hex << static_cast<int>(c) << ")\n"; }
如果输出中出现0x00(空字符),说明解析过程中引入了截断输出的异常字符,这会直接导致签名验证失败。
方案2:更换Jsoncpp的解析API(推荐)
旧版Json::Reader已被标记为过时,跨平台兼容性差,建议使用官方推荐的Json::CharReaderBuilder(Jsoncpp 1.8.0+支持)。修改后的完整代码:
#include <iostream> #include <fstream> #include <json/json.h> #include <string> #include <sstream> int main() { Json::Value root; std::string filePath = "/usr/data/signature.json"; // 读取文件内容到字符串 std::ifstream file(filePath); if (!file.is_open()) { std::cerr << "Error opening file: " << filePath << std::endl; return 1; } std::stringstream buffer; buffer << file.rdbuf(); // 使用CharReaderBuilder解析JSON Json::CharReaderBuilder builder; builder["collectComments"] = false; JSONCPP_STRING errs; bool parsing = Json::parseFromStream(builder, buffer, &root, &errs); if (!parsing) { std::cerr << "Parse error: " << errs << std::endl; return 1; } std::string signature = root["signature"].asString(); std::cout << "size = " << signature.size() << std::endl; std::cout << "Signature string: " << signature << std::endl; return 0; }
方案3:检查文件本身的完整性
用hexdump命令对比aarch64和x86_64平台上的JSON文件二进制内容,确保文件未被篡改或传输时引入异常字节:
hexdump -C /usr/data/signature.json
方案4:编译时指定字符编码(针对旧版Jsoncpp)
如果使用的是较旧的Jsoncpp版本,编译时添加宏定义强制使用C locale,避免字符编码处理差异:
g++ your_code.cpp -o your_program -ljsoncpp -DJSONCPP_USE_C_LOCALE=1
内容的提问来源于stack exchange,提问作者user2997518
相关产品推荐
相关产品推荐

