一个写16进制数据的问题

程序心声 2013-04-01 04:50:42
大家好,我想问一个关于如何在文件中写入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不太好实现,也可以说说用其他的方法如何解决。
...全文
4887 81 打赏 收藏 转发到动态 举报
写回复
用AI写文章
81 条回复
切换为时间正序
请发表友善的回复…
发表回复
Joseph_ 2013-04-07
  • 打赏
  • 举报
回复
....... 大坑啊!! 我错过了一场好戏呀....看来放假不一定是好事啊.! 膜拜中...
lin5161678 2013-04-07
  • 打赏
  • 举报
回复
一个人 没看懂你的问题 可能是那个人不仔细 两个人 没看懂你的问题 可能是你的问题比较深奥 全部人都看不懂你的问题 那只能是你的问题 你好好想想你要说什么 另外 你的能力先不说 你做人的水平可就真不怎么样 这里你的问题 先检查string 里面的数据是什么你没说清楚 是"0xDD0xFF"//这个是2个字符 还是 "123DEF"//这个是6个字符 然后你说的写入文件 想得到什么效果你也没说 你是想做到 文件内容是 0xFF0xEE //8个字符 还是希望文件内容 ................. 老实说 你在一楼balbalbal扯了一大堆 其实基本什么都没说
lgm277531070 2013-04-07
  • 打赏
  • 举报
回复
引用 35 楼 NianHui 的回复:
引用 29 楼 et214721856 的回复:从这语气一点都看不出是请教的态度,哎,这人生要悲剧了。 楼主你好 楼主再见
LZ态度太差了, C++我是不懂,不过,即使我懂,我也不会回答,态度这么恶劣,人家好心帮忙,得到的却是你的恶劣评价
jackydi 2013-04-07
  • 打赏
  • 举报
回复
楼主不是来请教问题的,是来当教授的。
darksmile 2013-04-07
  • 打赏
  • 举报
回复

#include <string>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <algorithm>

using namespace std;

void pc(const char, ostream&);

int main(void) {
	string s;

	cout << "Input a text of line: ";
	cin >> s;

	ofstream of("a.txt", ios::out);

	for_each(s.begin(), s.end(), bind2nd(ptr_fun(pc), of));

	cout << endl;
}

void pc(const char c, ostream& writer) {
	writer << setw(2) << hex << (const int&)c;
}
jhlxz2003 2013-04-07
  • 打赏
  • 举报
回复
不多说,楼主人品太差,没前途。
程序心声 2013-04-07
  • 打赏
  • 举报
回复
这几天很忙,一直在加班,没时间看帖子,现在可以结贴了。 在这里,我多说两句,本来,我以为,我已经把问题说的很清楚了(直到现在我都是这么认为的),不论是不是我的原因,对没理解题意的人,都表示歉意,我也很感谢那些“真正帮助”过我的人,这里列举一下:“rocktyt2”、“d1x2p3”、“h_w_m”、“wangzaiwei2006”、“ForestDB”、“darksmile”、“Mackz”、“hl449006540”等等,列的不全,还有人没有提到的话,请不要介意。不论回答的对不对,我有没有采纳,我都谢谢实心想帮助我,真正谈论技术的人。 其实,我想说的就是,我要写的不是: 也不是: 而是: 而内容是已经定好的,不用转换。 现在大家对照我的语言,难道不清楚,如果你们要表达,又会怎么表达。不过,有很多人还是看懂了我的意思,这里就不列举了。还有,大家上CSDN,不是来斗嘴,还是来交流技术,提高技能的,有的人只是灌水,还有甚至不知道事情原委,不明情况就恶语相向,我真是觉得讽刺,如果有这时间,听听音乐也好,何必写那些对自己也没有什么好处的文字,还只会让自己本身就等同于自己所鄙视的那一类人,在说别人的同时也要注意自己的素质。 还有人说我结贴率低,只有60%,我说明一下,我只发过5个帖子,包括这个帖子在内,只有两个没有结,我希望发言的时候,也不要随意妄下结论,这种明显缺乏依据的理由,能说明什么。 本来这个帖子,是30分,我加到100分,感谢帮助我,及支持我的人。我还从来没有发过有超过50层楼的帖子,壮观啊,谢谢大家,结贴!
aha151515 2013-04-06
  • 打赏
  • 举报
回复
标准库好像有这样的函数吧
偷懒的加菲 2013-04-05
  • 打赏
  • 举报
回复
十六进制的文件其实是一种文本文件,有一定的格式,可以用记事本打开 下面是原来用过的写二进制的方法。

CFile ffile;
ffile.Open(fileDlg.GetPathName(),CFile::modeCreate | CFile::modeWrite);
CArchive ar(&ffile,CArchive::store);
ar << (char)((Sound_Address[i*2]>>(j*8)) &0x000000ff);
珊瑚礁_ 2013-04-05
  • 打赏
  • 举报
回复
楼主的意思是输入:"30313233"(十六进制的),存入一个bin文件以后,使用winHex打开,会发现上面写着30313233,以笔记本方式打开,会发现上面写着0123,所以楼主问的问题就是BCD转十六进制的问题,对于这个问题,首先要确定数据源使用的编码和位数,假设是ascii码,八位的,则接收数据源,每个字节一个周期,于是当第一次截取时会截到3和0,将两个数字从字符型转换成整数型,则第一个数字3被转换成0x33,判断第一个数字3的转换值是否<=0x39,是则将该整形值减0x30加入(+=)一个变量a中(该变量初始化时为0),否则将该整形值减0x37再加入a中,再循环转换0,一个周期结束,二进制方式写入a,循环下一个周期.大概就这样吧,我c忘很多了,写写思路,不知道能否达到楼主要求
JinCraft 2013-04-05
  • 打赏
  • 举报
回复
问题都表述不清还训斥别人。

楼主还以为大家都从来没写过文件只写过hello world,哈哈哈

随便挑个软件学院的学生都比楼主强百倍,至少语言表达能力要强,还更懂礼貌,哈哈哈

DannyPassante 2013-04-03
  • 打赏
  • 举报
回复
好像是用std::cout<<std::hex<<"text"<<endl; text 是你要转的东西。
菜牛 2013-04-03
  • 打赏
  • 举报
回复
呵呵,呵呵,太晚了还真出错
int buffer[] = { 0xaa,0xbb,0x00, 0xcc,0xdd }; // 这是16进制吧?
FILE* pFile = fopen("D:\\Data.bin", "w");
fwrite((char*)buffer, sizeof(buffer), 1, pFile);
fclose(pFile);
菜牛 2013-04-03
  • 打赏
  • 举报
回复
不知道楼主发表了什么散文诗歌这么厉害,连数据格式都搞不清楚的就来训别人,连string不能处理二进制数据,cout的<<只能处理文本型字符串,以及其他非常非常基本的的东西都不明白的人,啪啦啪啦瞎邹邹一大段话把一个非常简单及其基本的问题当做世纪难题来描述,唬得一些新手不知所措露出崇拜的眼神……我只想说,我啥也没发表过,工作快20年了,实在惭愧。但是,同志们千万别被大段玄妙的话唬住了,这个问题没必要研究的,只要谁随便看过一本C++教程前两章都可以解决。为了防止有人继续被唬被训,也为了让发表过文章的人不要瞎摆谱,请看:
int buffer[] = { 0xaa,0xbb,0x00, 0xcc,0xdd }; // 这是16进制吧?
ofstream outfile("D:\\Data.bin");
outfile.write((char*)buffer, sizeof(buffer));
outfile.close();
对于楼主这种高手肯定不屑于这么简单的方法的,有更高的手有更复杂的方法也说不定,因为用C也很简单:
int buffer[] = { 0xaa,0xbb,0x00, 0xcc,0xdd }; // 这是16进制吧?
FILE* pFile = fopen("D:\\Data.bin", "r");
fwrite((char*)buffer, sizeof(buffer), 1, pFile);
fclose(pFile);
赵4老师 2013-04-03
  • 打赏
  • 举报
回复
引用 57 楼 NianHui 的回复:
16,17,22,24,29,38,39,40,41,42,这些楼层去哪了
掉黑洞里去了! 为什么要有数据结构这个东东? 因为要将现实世界或者抽象理论中的各种数据保存在计算机外存(光盘、硬盘、U盘……)或内存(ROM、RAM、SRAM……)里面的二进制字节数组中。 然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。至于具体如何处理就是所谓算法。 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
Dstnoe 2013-04-02
  • 打赏
  • 举报
回复
我的理解是这样的: 别人给你的文件是用字符表示的16进制数,比如 字符串“123A”就是0x123A.你想把0x123A以二进制的方式存放在文件中。 你说的别人给你的16进制文件是不是指这个“123A”? 你想看到的16进制是不是0x123A? 如果我的猜测是正确的话,你需要先把字符串“123A”转换成整形0x123A。 你保存不正确的原因是,字符“1”是16进制的0x31,而不是0x1。
ForestDB 2013-04-02
  • 打赏
  • 举报
回复
如果LZ实在描述不清楚,请follow我的指示: string strContext; //此处strContext已经得到了从别的地方获取的数据,而这个数据本身,就是16进制的 strContext的内容,到底是什么? 如果描述不清楚,请贴出 cout << strContext; 这一语句输出的内容,大家帮你描述 注意,不要你的描述,只要代码的输出,贴出来。 不能清晰的描述,只会让人摸不着头脑,而猜也是很辛苦的。
ForestDB 2013-04-02
  • 打赏
  • 举报
回复
换个说法 既有 int a = 1; 也有 char a = '1';(string a = "1") LZ指的哪种?
ForestDB 2013-04-02
  • 打赏
  • 举报
回复
LZ说的,不了解。 我知道的: 数字1 既可以是 0x01 0x00 0x00 0x00 也可以是 0x31 LZ指的哪一种?
程序心声 2013-04-02
  • 打赏
  • 举报
回复
引用 22 楼 FancyMouse 的回复:
引用 15 楼 guoduhua 的回复:我的老师教给我,上课回答问题,先听清楚了问题再说。这是起码的礼貌与尊重。 我相信,能上CSDN的也都是上过学,受过教育的人。这点起码的做人道理应该是懂得! 我不想重复说过的话(难道还要让我再敲一遍?) 要想问答问题,就去看原题,或者再去念一遍小学。 我就很纳闷,你连题都不想看,你可以不回答啊,你回答个什么劲啊。既想占分,还……
那你就呵呵吧,对于呵呵的,不需要在这里发言,这里是给回答问题的,不是给你在这里乱说话捣乱用的,我语文好不好,我在杂志上发表过文章,你呢?现在怎么什么乱七八糟的人都有。有答案,能解决,我欢迎。肚子里没有墨水,即帮不了人还乱喷的,请检点自己的行为!不要貌似是读过书的,连点起码的行为尝试和做人道理都不懂!不参与解决我不怪你,但不正经解决问题,还胡说八道,奇谈怪论,就会让自己本来就不高大的身份更加的低贱!你可以绕行,谁也没让你来!请自重!
加载更多回复(36)

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧