首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Xcode 下寫入 JPG 文件格式異常?C++ 文件讀寫二進制模式關鍵點

     編輯:程式設計疑難解答

問題現象

在 Xcode 中將 JPG 圖片數據寫入本地文件後,文件格式似乎發生變化,導致後續 C++ 讀取時提示「非 JPG 文件」。

根因分析

文本模式 vs 二進制模式 是經典坑:

  • Windows/MSVC 預設 文本模式:\n (0x0A) 會被轉換為 \r\n (0x0D 0x0A),二進制數據中若包含 0x0A 會被破壞。
  • macOS/Linux/Xcode 預設 二進制模式:無轉換,但代碼若顯式指定文本模式或使用 << 運算符輸出二進制數據,同樣會出問題。

錯誤代碼典型特徵

// 錯誤示範:使用文本模式或流運算符寫二進制
ofstream out("image.jpg");  // 缺少 ios::binary
out << binaryData;          // 運算符<< 格式化輸出,不適合二進制

正確寫法

#include <fstream>
#include <vector>

bool writeJpg(const char* path, const unsigned char* data, size_t len) {
    std::ofstream ofs(path, std::ios::binary | std::ios::trunc);
    if (!ofs) return false;
    ofs.write(reinterpret_cast(data), static_cast(len));
    return ofs.good();
}

// 讀取同理
std::vector readJpg(const char* path) {
    std::ifstream ifs(path, std::ios::binary | std::ios::ate);
    if (!ifs) return {};
    size_t len = ifs.tellg();
    ifs.seekg(0);
    std::vector buf(len);
    ifs.read(reinterpret_cast(buf.data()), len);
    return buf;
}

驗證文件完整性

  1. Hex 編輯器對比:原始文件與寫出文件的前 16 字節(JPG SOI 標記 FF D8 FF)。
  2. 文件大小:必須一致。
  3. md5sum/sha256sum:哈希值完全一致才算真正「原樣保存」。

其他潛在坑

  • 中間經過 std::string 存儲二進制數據(string 以 \0 結尾,截斷數據)。請用 std::vector<unsigned char> 或 std::string 配合 data()/size()。
  • 網絡傳輸未處理大端序(JPG 內部為大端,通常無需轉換,但自定義協議需注意)。

核心原則:**二進制數據全程二進制模式,拒絕任何格式化輸出/輸入操作。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved