vc中诸如 std::ifstream 等读取文件后,获得的数据都为字符串形式。而有时候需要用到文件的字节数组形式。
在ASCII码中,一个英文字母(不分大小写)占1个字节的空间,一个中文汉字占2个字节的空间。在Unicode中,不分英文、中文,都占2个字节。
byte[]转成String的时候,使用用BASE64来转码,否则会因为字符转换问题(不是所有的byte组合都能映射为char),导致内容丢失。
String转为byte[],也用BASE64。
例子:
CString mystr = "啊实打实大师的xsadada哈哈";CString strOut = L"";CString str;for(int i = 0; i < mystr.GetLength(); i++){ str.Format(L"%02X", (BYTE)mystr.GetAt(i)); //十六进制 strOut += str;}或
char* pcData = “sadakd按时到敬爱是大家” ;
CString strOut = L"";
CString str;
for(int i = 0; pcData[i] != '\0'; i++)
{
str.Format(L"%02d", (BYTE)pcData[i]); //十进制
strOut += str;
}
附 ifstream 读取文件方法:
#include <iostream>
#include <fstream>
#include <io.h>
#include <shellapi.h>
#pragma comment(lib,"Setupapi.lib")
char* LoadFile(LPCTSTR lpszFilePath)
{
CString szTmp = lpszFilePath;
if(!PathFileExists(szTmp))//char* 判断文件存在: if( (_access( strPath, 0 )) != -1 )
return NULL;
std::ifstream infile;
locale::global(locale(""));//兼容中文路径
infile.open(szTmp,std::ios::in|std::ios::binary);
locale::global(locale("C"));
if (!infile.is_open())
{
return NULL;
}
infile.seekg(0, std::ios::end);
int length = infile.tellg();
if (length <= 0)
{
infile.close();//关闭文件
return NULL;
}
infile.seekg(0, std::ios::beg);
char* sData = (char*)malloc(length+1);
infile.read(sData,length);
sData[length] = '\0';
infile.close();//关闭文件
return sData;
}
浙公网安备 33010602011771号