一个写16进制数据的问题
大家好,我想问一个关于如何在文件中写入16进制数据的问题,但大家一定不要刚看到标题,就啪啪啪给我几行代码,这样的结果,很可能不是我想要的。注意了,我要写的16进制,不是我要把现在的文本或数据,改成16进制的格式,而是,我现在已经有了16进制的数据内容,我现在要把它原模原样的写入文件中,该怎么做。
这个问题看着也不难,但我试了N多次,就是不能如愿,实在是很郁闷!
代码如下:
string strContext; //此处strContext已经得到了从别的地方获取的数据,而这个数据本身,就是16进制的
fstream outfile;
const char* FileName = "D:\\Data";
outfile.open(FileName, ios::out | ios::binary); //此处“| ios::binary”或者加或者不加 --①
outfile << strContext << hex; //此处“<< hex”或者加或者不加 --②
outfile.close();
不论①或者②如何的排列组合,总之,运行的结果是:要么我的内容,被当成文本写入文件,要么那些本来就是16进制的数据,被再次翻译为了16进制,然后存入文件。我现在就想把这些数据,按照其原本的格式,写入文件中,其16进制的显示,和其原先的样子是一样的,不要再改变。这该怎么做啊。
哎,急死我了,也许就是一个小地方没处理好,应该不难,可就是不如人意,会的人肯定一眼就明白我的意思了,请大家帮助,谢谢了。
PS:如果用fstream不太好实现,也可以说说用其他的方法如何解决。 16进制 写文件
[解决办法]
不一定有帮助。
16进制的数据是存在高低字节序的,string没有字节序。
所以,试试看,不用string存16进制数据,改用unsigned int[]存。
然后以ios::binary方式写入。
祝LZ好运。。
[解决办法]
string strContext;
....
FILE *outfile;
const char* FileName = "D:\\Data.bin"; //<<<文件名,加个扩展名,减少当文本打开查看的机会
outfile = fopen(FileName, "wb"); //二进制方式打开是必需的
fwrite(strContext.c_str(),strContext.size(),1,outfile);//<<<直接写内存块,不存在转换问题
fclose(outfile);
//如果上面C风格的代码还是不能如愿,那么得检查一下数据在内存中时是否已不对
for(int i=0;i<strContext.size();i++) printf("%02x ",strContext[i]);//<<<检查一下内存块中内容
[解决办法]
我的理解是这样的:
别人给你的文件是用字符表示的16进制数,比如 字符串“123A”就是0x123A.你想把0x123A以二进制的方式存放在文件中。
你说的别人给你的16进制文件是不是指这个“123A”?
你想看到的16进制是不是0x123A?
如果我的猜测是正确的话,你需要先把字符串“123A”转换成整形0x123A。
你保存不正确的原因是,字符“1”是16进制的0x31,而不是0x1。
[解决办法]
size_t i = 0;
unsigned int idata;
for (; i < strContext.length(); i+=sizeof(unsigned int)*2)
{
sscanf(strContext.c_str()+i, "%8ux", &idata);
outfile.write((char*)&idata, sizeof(unsigned int));
}
unsigned char cdata;
for (; i < strContext.length(); i+=2)
{
sscanf(strContext.c_str()+i, "%2ux", &cdata);
outfile.write((char*)&cdata, 1);
}
#include <string>
#include <sstream>
#include <fstream>
#include <iomanip>
using namespace std;
int main(int argc, char ** argv) {
string s1 = "1234";
unsigned int n;
char cc[4];
stringstream ss(s1);
ss >> hex >> n;
unsigned int mask = 0x000000FF;
cc[3] = (char)(n & mask);
cc[2] = (char)((n >> 8) & mask);
cc[1] = (char)((n >> 16) & mask);
cc[0] = (char)((n >> 24) & mask);
ofstream ofs("a.txt", ios::out
[解决办法]
ios::binary);
ofs.write(cc, sizeof(cc));
}
int buffer[] = { 0xaa,0xbb,0x00, 0xcc,0xdd }; // 这是16进制吧?
FILE* pFile = fopen("D:\\Data.bin", "w");
fwrite((char*)buffer, sizeof(buffer), 1, pFile);
fclose(pFile);
CFile ffile;
ffile.Open(fileDlg.GetPathName(),CFile::modeCreate
[解决办法]
CFile::modeWrite);
CArchive ar(&ffile,CArchive::store);
ar << (char)((Sound_Address[i*2]>>(j*8)) &0x000000ff);