论坛: 菜鸟乐园 标题: 熟悉BCB编程的朋友请进 复制本贴地址    
作者: ypy [ypy]    见习版主   登录
我想在BCB中实现把文本文件中的内容转换成16进制ASCII码,代码中一部分如下:
   
pszBuffer=new char[iFileLength+1];
//读取文件内容
iBytesRead=FileRead(iFileHandle,pszBuffer,iFileLength);   
FileClose(iFileHandle);
//转换成16进制ASCII码
for(j=0;j<iBytesRead;j++)
{
  sprintf(hexchar,"%02x",int(pszBuffer[j]));
  hexBuffer+=AnsiString(hexchar).UpperCase();
}
delete []pszBuffer;
iFileHandle=FileCreate(ListBox1->Items->Strings[i]);
iFileLength=hexBuffer.Length()+100;
//把16进制ASCII码写入文件
FileWrite(iFileHandle,hexBuffer.c_str(),iFileLength);  
FileClose(iFileHandle);

其中前面的iFileHandle为读入内容的文件句柄,文件长度iFileLength值已定。

几个变量的声明:
   int i;
   int j;
   int iFileHandle;
   int iFileLength;
   int iBytesRead;
   char *pszBuffer;
   AnsiString hexBuffer;
   char hexchar[4];

头文件包括:
#include <SysUtils.hpp>
#include <stdio.h>

请教:为什么对文件中的中文不能正确处理,我该怎么改才正确?
谢谢了各位!




[此贴被 ypy(ypy) 在 03月22日23时20分 编辑过]

地主 发表时间: 2003-03-22 23:16:20

回复: ypy [ypy]   见习版主   登录
各位请帮个忙啊

B1层 发表时间: 03/23 22:41

回复: 286 [unique]   版主   登录
ASCII码只是一个符号代码,无16进制10进制一说。
汉字在处理的时候,一个汉字并不是当成两个字符,而是汉字一次读就是一个汉字。更不能转化成大写了。
问题出在:
//////////////////////////////////////////////
  sprintf(hexchar,"%02x",int(pszBuffer[j]));
  hexBuffer+=AnsiString(hexchar).UpperCase();
///////////////////////////////////////////////
改成:
///////////////////////////////////////
  sprintf(hexchar,"%02X",pszBuffer[j]);
  hexBuffer+=AnsiString(hexchar);
///////////////////////////////////////
试试。

B2层 发表时间: 03/24 11:46

回复: ypy [ypy]   见习版主   登录
谢谢你的回复
不过有点疑问:
1.ASCII码可以转换成任何进制数
2.int(pszBuffer[j])是把pszBuffer[j]强制转换成int数
  如果如你所说,那程序的结果应该是复制文件了,而且要改也应该改成
  sprintf(hexchar,"%s",pszBuffer[j]);

我记得中文要分为两个部分高字节和低字节处理,可是不知道具体怎么做

希望再跟帖

B3层 发表时间: 03/24 15:04

回复: 286 [unique]   版主   登录
1.“ASCII码可以转换成任何进制数”,这是对的,但转化后的无论是哪个进制,都不再叫ASCII码了,而变成了一个普通的数,别的数也可以转化成ASCII码。

2.“int(pszBuffer[j])是把pszBuffer[j]强制转换成int数
  如果如你所说,那程序的结果应该是复制文件了,而且要改也应该改成
  sprintf(hexchar,"%s",pszBuffer[j]);”,pszBuffer[j]本身定义的虽然是char型,但在内存中存的是个数。也就是某个数的ASCII值,其值与转化成int后是一样的。"%s"是对字符串的,对字符不行,对整型更不行。

3 “我记得中文要分为两个部分高字节和低字节处理,可是不知道具体怎么做”早期的汉字系统为了和ASCII兼容,并规定每个字节最高位都为1的连续两个字符为一个汉字。为0的仍为ASCII字符。但在Windows系统中,现在一般采用unicode码。处理方式不一样。

B4层 发表时间: 03/24 17:32

论坛: 菜鸟乐园

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号