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;  
}  

  

posted on 2016-06-01 16:33  Love流浪的猪  阅读(1087)  评论(0)    收藏  举报