2016-01-12 51 views
-2

我正在讀取H.264比特流作爲C++中的Hex文件。我想在某些條件滿足時插入一些字符串。
enter image description here
像在附加圖像中,如果00 00 00 01的十六進制值出現在文件中的任何位置,我想在文件00 00 00 01之前添加一些像ABC這樣的字符串,並將其另存爲新文件。現在寫我的方法是以十六進制格式讀取h.264文件。將其轉換爲字符串並進行字符串比較。如果有辦法我可以做一個直接的十六進制比較?這裏是我當前的代碼十六進制值比較並保存到文件C++

#include "stdafx.h" 
#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <string> 
#include <iomanip> 
using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
unsigned char x; 
string s1,s2,s3; 
s2="Mushahid Hussain"; 
s3="0000000141"; 
std::ifstream input("d:\\Jm\\videos\\trying2.264", std::ios::binary); 
input >> std::noskipws; 
while (input >> x) { 
    long constant = 0x0000000168; 
    std::ostringstream buffer; 

    buffer << std::hex << std::setw(2) << std::setfill('0') 
      << (int)x; 
    s1=buffer.str(); 
    if (s1.find(s1) != std::string::npos) { 
     cout<<"hello"; 
    s1+=s2; 
} 
std::ofstream outfile; 

    outfile.open("d:\\Jm\\bin\\trying5.264", std::ios_base::app); 
    outfile << s1; 

} 

    return 0; 
} 


編輯1
作爲回答Tommylee2k我能夠追加字符串。但問題是在文件末尾的十六進制CD值附加如附圖所示。 enter image description here

+0

_'while的其餘部分(輸入>> X){'_您想要讀取二進制內容,但實際上是指文本格式的輸入。而是使用'std :: istream :: read()'來檢索文件的二進制內容。 –

+0

@πάνταῥεῖ但不會讀取文件作爲十六進制我猜。文件h.264比特流,所以我想讀它作爲一個十六進制文件。 – james

+0

所以你實際上在那個文件中有ASCII編碼的十六進制值? _「h.264比特流」_通常不是這樣編碼的,只是包含純二進制數據。 –

回答

1

也許更好的方法是將二進制文件讀入內存緩衝區,然後找到memcmp()。 當你找到你的方式,你寫的提前比賽的塊,那麼你的「ABC」 -string,並繼續搜索該文件

#include <stdio.h> 
#include <string.h> 
#include <memory.h> 
#include <malloc.h> 

char pattern[4]= { 0x00,0x00,0x01,0x67 }; 

char *memfind(char *s, int len, char *p, int plen) { 
    int n=0; 
    char *pos = s; 
    while ((pos-s)<(len-plen)) { 
     while (*(pos+n) == *(p+n) && n<=plen) n++; 
     if (n==plen) 
      return pos; 
     pos++;n=0; 
    } 
    return NULL; 
} 

int main() { 
    FILE *in = fopen("in.vid", "r+"); 
    FILE *out = fopen("out.vid", "wb"); 

    // get Filesize 
    size_t size = 0; 
    fseek(in, 0L, SEEK_END); 
    size = ftell(in); 

    // read whole file in 
    char *buffer = malloc(size); 
    fseek (in, 0L, SEEK_SET); 
    fread (buffer, size, 1, in); 

    char *currentPos = buffer; 
    char *found; 
    if (buffer) { 
     while (1) { 
      found = memfind(currentPos, size-(currentPos-buffer), pattern, sizeof(pattern)); 
      if (found==NULL) break; 
      fwrite(currentPos, 1, (size_t) (found-currentPos), out); 
      fwrite("ABC", sizeof("ABC"), 1, out); 
      fwrite(pattern, sizeof(pattern),1,out); 
      currentPos=found+4; 
     } 
     fwrite (currentPos, 1, (size_t) size - (currentPos-buffer), out); 
     free(buffer); 
    } 
    fclose (in); 
    fclose (out); 

    return 0; 
} 
+0

沒有像strstr那樣的「尋找」內存,所以我不得不親自編寫它 – Tommylee2k

+0

+1。非常感謝答案。我能夠追加字符串,但執行代碼後遇到一些問題。請看看最新的問題。謝謝 – james

+0

還有如何比較多種模式? – james