前言
最开始接触编程的时候,接触的C语言,我觉得这个先后顺序很重要,一上来如果让我学Java我可能对字节和地址会毫无概念,所以我强烈建议,想学编程,想学算法,建议从C学起。在C语言里,非常自由的是变量的类型,0和NULL,0和false,都可以做比较。
你或许已经学习了字符或字符串,知道了编程语言的变量类型、循环条件、函数定义和包、类的引用,但是对电脑来说,除了0和1,它什么都看不到,或许未来有人可以找到三态或更高状态转换的方式,来提高运算速度吧。
字节
字节是一个数字信息单元,最常见的有8个位代表一个二进制数。从计算机的发展史看,字节是用于计算机中编码单个文本字符的位数,因此它是许多计算机体系结构中最小的可寻址存储单元。
我相信你你一定看到过某某面试被问,一个int多少字节?这个问题,或者是,一个int多少位?其实在字节的大小历史上一直与硬件有关,并且没有确定大小的确定标准。现代计算机的操作系统通常使用32位或64位架构,也就是由4或8位构成。那么,一个int 在32位和64位系统上都是4字节,而
1字节(Byte) = 8位(bit)
这样你应该就能理解了吧?
现在假设你有一个txt里面有很多文字,想用程序读取它读到了这些内容之后,以正常的字符显示出来,中文的显示中文,英文的显示英文,数字显示数字,这个时候就需要理解一个中文占几个字节,一个英文占几个字节,如何判断中文或英文呢?请往下看
编码
ASCII
abbreviated from American Standard Code for Information Interchange
美国标准信息交换码
是一种字符编码用于电子通信标准,ASCII代码表示计算机,电信设备和其他设备中的文本。大多数现代字符编码方案都基于ASCII。
我们通常数数的时候都是10进制的,满10进位,于是我可以说,A不是A,是65,B不是B,是66.看下图:
由于ASCII定义了128个字符,在现代社会如此众多的语言中用这些字符来表示已然不够使用,于是有了新的编码:Unicode。
Unicode
Unicode是ASCII的超集,数字0-128在ASCII中的含义与在Unicode中的含义相同。Unicode为每一个字符提供了唯一的编码,因此如果使用Unicode,则不会出现编码对应混乱或者不兼容的问题。
在Visual Studio 2010往上都开始默认使用Unicode编码,下面一段代码就是读取文件然后使用宽字节编码的代码
void RdviewFile() {
wchar_t * TmpCurrentPathB = GetCurrentPath(L"MyResource\\");//exe所在绝对路径
wcscat_s(TmpCurrentPathB, MAX_PATH, SELECTEDTXT);
HANDLE MFILE = CreateFile(TmpCurrentPathB, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);//windowsAPT获取文件句柄
int Msize = GetFileSize(MFILE, 0);//获取文件大小
if (Msize > 0) {
char *Mtxt = new char[Msize + 1];//为缓冲区申请内存
DWORD Mbyte;//out读取文件的实际大小
ReadFile(MFILE, Mtxt, Msize, &Mbyte, 0);//读取文件保存到缓冲区
Mtxt[Msize] = 0;//为结尾赋零
int unicodelen = MultiByteToWideChar(CP_ACP, 0, Mtxt, -1, 0, 0);
wchar_t * pUnicode;//定义U码指针
pUnicode = new wchar_t[unicodelen];//申请U码缓冲区
MultiByteToWideChar(CP_ACP, 0, Mtxt, -1, pUnicode, unicodelen);//ANSI转换宽字节
TxtInfo.TXTCONTENT = pUnicode;
TxtInfo.TXTSIZE = unicodelen;//字符数
}
else {
TxtInfo.TXTCONTENT = 0;
TxtInfo.TXTSIZE = 0;
}
CloseHandle(MFILE);
return;
}
如果需要完整的项目代码可以参考我写的代码 屋顶打字通
共同学习,写下你的评论
评论加载中...
作者其他优质文章