十六进制值比较并保存到文件C ++

时间:2016-01-12 18:52:34

标签: c++ hex comparison

我在C ++中将H.264比特流读作Hex文件。我想在满足某些条件时插入一些字符串。
enter image description here如同在附加图像中,如果文件中任何地方出现十六进制值00 00 00 01,我想添加一些像文件中的00 00 00 01之前的ABC并将其另存为新文件。现在写我的方法是将h.264文件读为十六进制。将其转换为字符串并进行字符串比较。如果有办法我可以进行直线十六进制比较?这是我目前的代码

 #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

1 个答案:

答案 0 :(得分:1)

或许更好的方法是将文件二进制文件读入内存缓冲区,然后找到memcmp()。 当你找到你的模式时,你在匹配之前写了块,然后你的&#34; ABC&#34; -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;
}