求助,关于BYTE 的问题 我现在有一个数组BYTE *tmp = new BYTE[100], 然后我在这个数组里存储了100个数据,我现在想把这100个BYTE型的数据保存到一个文本文档中,结果写入文件以后显示是乱码,请问该怎么转换才能让文件中显示是十进制整数呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 BYTE *tmp = new BYTE[100] 改为BYTE *tmp = new BYTE[101], 你要对每个数据作转换比如CString str;str.Format("%d", tmp[0]);然后将这个字符串写入文件但是如果这么处理你读取的时候还要转回来 当然要转成字符写进去了,你是怎么写的,如BYTE是100,而不是字符串“100”,写进出当然显示不出来了 想写成文本,要用printf族的函数转换成字符串再写。 BYTE类型的数据应该是二进制,怎么会是100呢?,肯定也不会是“100”,用ultraedit打开文件显示十六进制是正确的。 你显示的乱码应该是字符类型所致,写入文件的时候强制类型转换就是了。如下面程序段中的m_pSrcImageData本来为字符类型,如果不强制转换就会显示乱码。//将图像像素数据写入一个文本文件中 fstream file("原始载体像素值.txt",ios::in|ios::out); file<<"原始载体像素值为:"<<'\n'; for (j = 0; j < m_nSrcImageHeight; j++) { for (i =0; i < m_nSrcImageWidth; i++) { file << (int)m_pSrcImageData[j*m_nSrcImageWidth+i]<<'\t'; } file << endl; } file.close(); 看来楼主还没理解四楼的意思!既然你明白 BYTE 类型是二进制内容,那写到文件里当然就是二进制数据啦,试问二进制数据怎么可能显示出10进制数呢?首先得把它转换成字符型数据,再写入!但是你要再理解一点,虽然你申请了100个BYTE数据,而BYTE只占一个字节,但是当你转换成字符数据后,写入的文本就不止100个字节了! 既然用了BYTE 却又要存明文进去,然后每个都转成字符再保存...这不麻烦吗....你要存明文就用string存16进制就用BYTE.... 不能直接写到记事本的 需要转换下 ,声明个CString 变量CString str;str.Format("%d", tmp[0]);然后将这个字符串写入文件但是如果这么处理你读取的时候还要转回来 void CMFCtestDlg::OnButton3() { // TODO: Add your control notification handler code here BYTE bData[100]; int i = 0; for (i=0;i<100;i++) { bData[i] = i; } char bFile[100*5+1]; for (i=0;i<100;i++) { sprintf(&bFile[i*5],"0x%02x,",bData[i]); } CFile file; file.Open("test.txt",CFile::modeReadWrite|CFile::modeCreate); file.Write(bFile,500); file.Close(); }楼主,试试这个代码,把十六进制一个一个转成ASCII码放到文件里的,可以生成一个 test.txt 文件,打开可以看到内容的. 谢谢,你的代码好用。令请问,我要想把BYTE数组里的数都转成int型该怎么写呢?谢谢了。 int i = tmp[9];就像这样 回16楼,你想把 char 型转成 int 型,意思是 1个 char 放到 1个 int 中,还是 4个 char 放到 1个 int 中?因为 char 是1字节,而 int 在我们的 VC6 编译器中是 4字节.如果1个放1个,就像 17楼那样可以了.如果4个char挤进一个int里,就要这样.char bByte[4] = {1,2,3,4};int a = bByte[0] | (bByte[1]<<8) | (bByte[2]<<16) | (bByte[3]<<24);又或者int a = *( (int*)&bByte[0] ) ;结果都是 a = 0x04030201 BYTE bData[100] = {0}; int i = 0; for (i=0;i<100;i++) { bData[i] = i; } char szBuf[512] = {0}; char szTmp[10] = {0}; for (i=0;i<100;i++) { sprintf(szTmp, "%d ", bData[i]); strcat(szBuf, szTmp); } try { CFile file; file.Open("F:\\11.txt",CFile::modeReadWrite|CFile::modeCreate); file.Write(szBuf,strlen(szBuf)); file.Close(); } catch (CFileException* e) { e->ReportError(); e->Delete(); } BYTE *pByte = new BYTE[100]; int i= 0;while (i != 100){ pByte[i] = 2*i+1; i++;}FILE *pf = fopen("c:\\t.txt","a+");i= 0;while (i != 100){ fprintf(pf,"%d ",pByte[i]); i++;}fclose(pf);delete []pByte; 大家都很热心,很感谢。问这个问题是因为我现在要保存一幅图像的灰度值,保存为一个二维矩阵,灰度值我是用BYTE表示的,保存成矩阵后要写入到文件中,所以要转换成string类型。然后还要对矩阵数据进行处理,所以又要把BYTE转换成int型。我不知道能不能在保存像素灰度值的时候就直接保存为int型呢? BYTE和int没有什么本质区别BYTE就是0-255int范围大些罢了 保存成什么都没关系,主要是你知道数据是如何放的,到时就如何取出来.4个byte放一个int,还是1个byte放一个int.都可以.放的方法与取的方法配合.最后取得你要的数据. 我上面的那个程序段就可以保存灰度图像数据,没有转换成CString类型,保存后也可以对图像数据进行处理,我前几天就是这样处理的,可以的。 如何从网站上download文件? 讨论 MDI 问题。 关于MFC中鼠标移动的问题 SDI CToolBar 怎么与View 通讯?或者说bar的按钮怎么调用View里的function COM/DCOM编程指南这本书谁有,想看看里面线程方面的 C++初学者求职(2年delphi经验,成都) 怎么查看内存泄漏? 如何中断正启动的程序中某内存地址后,读取寄存器值? 谁要《windows程序设计》----贱卖!与我联系!上下册,100元 高分请教,一个VC的常见问题,up有分 在进程地址空间中,每个函数都是共用一个堆栈吗? TAB控件里面的子窗口显示位置问题.
比如
CString str;
str.Format("%d", tmp[0]);
然后将这个字符串写入文件
但是如果这么处理
你读取的时候还要转回来
BYTE类型的数据应该是二进制,怎么会是100呢?,肯定也不会是“100”,
用ultraedit打开文件显示十六进制是正确的。
//将图像像素数据写入一个文本文件中
fstream file("原始载体像素值.txt",ios::in|ios::out);
file<<"原始载体像素值为:"<<'\n';
for (j = 0; j < m_nSrcImageHeight; j++)
{
for (i =0; i < m_nSrcImageWidth; i++)
{
file << (int)m_pSrcImageData[j*m_nSrcImageWidth+i]<<'\t';
}
file << endl;
}
file.close();
看来楼主还没理解四楼的意思!既然你明白 BYTE 类型是二进制内容,那写到文件里当然就是二进制数据啦,试问二进制数据怎么可能显示出10进制数呢?首先得把它转换成字符型数据,再写入!
但是你要再理解一点,虽然你申请了100个BYTE数据,而BYTE只占一个字节,但是当你转换成字符数据后,写入的文本就不止100个字节了!
存16进制就用BYTE....
str.Format("%d", tmp[0]);
然后将这个字符串写入文件
但是如果这么处理
你读取的时候还要转回来
void CMFCtestDlg::OnButton3()
{
// TODO: Add your control notification handler code here
BYTE bData[100];
int i = 0;
for (i=0;i<100;i++)
{
bData[i] = i;
}
char bFile[100*5+1];
for (i=0;i<100;i++)
{
sprintf(&bFile[i*5],"0x%02x,",bData[i]);
}
CFile file;
file.Open("test.txt",CFile::modeReadWrite|CFile::modeCreate);
file.Write(bFile,500);
file.Close();
}
楼主,试试这个代码,把十六进制一个一个转成ASCII码放到文件里的,可以生成一个 test.txt 文件,打开可以看到内容的.
就像这样
char bByte[4] = {1,2,3,4};
int a = bByte[0] | (bByte[1]<<8) | (bByte[2]<<16) | (bByte[3]<<24);
又或者
int a = *( (int*)&bByte[0] ) ;结果都是 a = 0x04030201
BYTE bData[100] = {0};
int i = 0;
for (i=0;i<100;i++)
{
bData[i] = i;
}
char szBuf[512] = {0};
char szTmp[10] = {0};
for (i=0;i<100;i++)
{
sprintf(szTmp, "%d ", bData[i]);
strcat(szBuf, szTmp);
} try
{
CFile file;
file.Open("F:\\11.txt",CFile::modeReadWrite|CFile::modeCreate);
file.Write(szBuf,strlen(szBuf));
file.Close();
}
catch (CFileException* e)
{
e->ReportError();
e->Delete();
}
int i= 0;
while (i != 100)
{
pByte[i] = 2*i+1;
i++;
}FILE *pf = fopen("c:\\t.txt","a+");i= 0;
while (i != 100)
{
fprintf(pf,"%d ",pByte[i]);
i++;
}
fclose(pf);
delete []pByte;
BYTE就是0-255
int范围大些罢了
4个byte放一个int,还是1个byte放一个int.都可以.
放的方法与取的方法配合.最后取得你要的数据.