读书人

一个写16进制数据的有关问题

发布时间: 2013-04-20 19:43:01 作者: rapoo

一个写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。
[解决办法]

引用:
果然是那样
那我提供一个方法你试试吧,不一定是最好的方法
C/C++ code?12345678910111213 size_t i = 0; unsigned int idata; for (; i < strContext.length(); i+=sizeof(unsigned int)*2) { sscanf("%8ux"……
哈哈,脑残了,参数反过来了
上面的不对,应该是这样
    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));
}


[解决办法]
没细看, 但一撇之下, 貌似这句写反了
outfile << strContext << hex;
[解决办法]
我是用C的,C++可能不太懂,仔细阅读了各层楼,提出点想法
首先,确认一下楼主的具体问题
楼主是不是说手上有一个文本文件(我先不管他是怎么来的,什么含义)。里面呢,打开可能是这种形式 “0xAA,0X70,0x00,0x56”等,它代表了一个二进制流的序列。
如果只是想解决这个问题的话,我因为不怎么会C++,所以我的办法是
A 方案
1,这个文件中各个数之间有没有分隔符?比如类似上面逗号这种,或者使用空格?
2,如果有的话,楼主应该有办法把分隔符,换成逗号吧?
3,然后把这个改好的文件改成tmp.h
4,在你的源程序中用个全局数组 比如 char data[]={#include“tmp.h”}
5,然后在源程序中直接把data二进制输出就可以了。。。
B方案
1,使用脚本程序。进行进制与文件输出转化,具体方法,如果楼主有兴趣可以查一下
C方案。
还是用你那套程序,把数据读到自己的缓冲中后,你要知道在缓冲中,其实0xAA 如果按ASCII码是被存储成为 '0' 'x' 'A' 'A' 这么4个字节的,所以无法直接输出为16进制的。或者说二进制的。除非你对这个缓冲进行手工的自己处理
你从缓冲中一个一个读取字节 凑成一个16进制意义的字串后,转为二进制。


另外,LZ火气太旺,还是需要注意提问的语气的,要知道很多人还是愿意回答问题的。你的表现会影响到别人回答的兴致的
[解决办法]
如果LZ实在描述不清楚,请follow我的指示:

string strContext; //此处strContext已经得到了从别的地方获取的数据,而这个数据本身,就是16进制的

strContext的内容,到底是什么?


如果描述不清楚,请贴出
cout << strContext;
这一语句输出的内容,大家帮你描述

注意,不要你的描述,只要代码的输出,贴出来。

不能清晰的描述,只会让人摸不着头脑,而猜也是很辛苦的。

[解决办法]
呵呵,呵呵,太晚了还真出错
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);

[解决办法]
楼主的意思是输入:"30313233"(十六进制的),存入一个bin文件以后,使用winHex打开,会发现上面写着30313233,以笔记本方式打开,会发现上面写着0123,所以楼主问的问题就是BCD转十六进制的问题,对于这个问题,首先要确定数据源使用的编码和位数,假设是ascii码,八位的,则接收数据源,每个字节一个周期,于是当第一次截取时会截到3和0,将两个数字从字符型转换成整数型,则第一个数字3被转换成0x33,判断第一个数字3的转换值是否<=0x39,是则将该整形值减0x30加入(+=)一个变量a中(该变量初始化时为0),否则将该整形值减0x37再加入a中,再循环转换0,一个周期结束,二进制方式写入a,循环下一个周期.大概就这样吧,我c忘很多了,写写思路,不知道能否达到楼主要求

读书人网 >C++

热点推荐