Unicode编码与大端小端
大端小端区别:
举例:
一个4字节的整型数据 0x12345678 高字节是0x12, 低字节是0x78,这个不用多说吧
存储地址假设为0x00000000 0x00000001 0x00000002 0x00000003, 地址逐渐变大,这个不用多说吧
那么如果是大端方式存储:
0x00000000 : 0x12
0x00000001 : 0x34
0x00000002 : 0x56
0x00000003 : 0x78
如果是小端方式存储:
0x00000000 : 0x78
0x00000001 : 0x56
0x00000002 : 0x34
0x00000003 : 0x12
Unicode编码:
Unicode编码:国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换。 --网上找的套话,说一下。
简单说就是英文用一个字节就可以表达所有字符了,而Unicode使用多个字节编码汉字,就是这么意思。
一般使用2个字节,基本常用汉字就包括了。
重点来了:
Unicode按照什么字节序编码的?
那就要看我们本机是大端还是小端方式了。
还是举例说明啊:
假如本机是大端方式,而别人给我们的数据也是大端方式排列的,那没有关系,直接使用相应语言的编码函数获取字符串就可以了。
假如本机是大端方式,而别人给我们的数据是小端方式排列的,那就需要一个重新排序,简单点说就是将两个字节颠倒位置就可以了。
顺便贴一下,怎么查看本机是大端还是小端排序,自己写的一个demo:
int _tmain(int argc, _TCHAR* argv[])
{
printf("Hello World !\n");
char aa[4] = {0x12,0x34, 0x56, 0x78};
printf("the index 0 is: %x\n", aa[0]);
getchar();
return 0;
}
如果输出:0x12,那么就是大端,输出0x78就是小端。
实际情况说明一下:
环境:c#, 获取中文歌名
数据排列方式:小端
本机默认方式:大端
编码方式:采用Unicode
使用的API: Encoding.Unicode.GetString()
问题:出现乱码
原因:
- 调试时候查看,发现每次获取到的数据是6个字节,按照2个字节编码一个中文汉字习惯,那么别人给我的是3个汉字。
- 别人给我的数据是按照小端方式排列的,也就是说第一个汉字所占的两个字节数据Data[0]表示低字节数据,Data[1]表示高字节数据,然后我就直接传给API Encoding.Unicode.GetString()了,结果发现乱码。
解决措施:
- 查询网上资料后发现存在大小端问题,于是查看自己的机器编码方式,发现是大端。
- 于是乎自定义函数,颠倒字节序,将其改成大端排列。重排方法:
// 翻转字节顺序 (16-bit)
public static void ReverseBytes(byte[] value)
{
for (int i = 0; i < 6; i += 2)
{
byte byTemp = value[i];
value[i] = value[i + 1];
value[i + 1] = byTemp;
}
}
原理就是将Data[0]和Data[1]互换,Data[2]和Data[3]互换。。。
- 再传给Encoding.Unicode.GetString()函数编码,发现正常了。
注意点:
- 无论大小端问题,还是编码问题,最小单位都是字节为单位。
- Unicode编码一般都是以2个字节为单位,也就是数据传过来都是2个字节一个模块,
大小端出问题也就是这两个字节排序是否乱了的问题。我之前将6个字节的Data使用Array.Reverse()重新排序了下,发现尴尬了,字符不乱码了,但是文字都倒过来了,“王力宏”变成了“宏力王”了。其实细想一下也对,这种方式将6个字节看做一个整体,将0和5对调, 1和4对调,等等。这样确实两个字节内部也颠倒了,但是总体也颠倒了。所以嘛,我总结后发现,只要两个字节就可以了。
好了,大小端问题先总结到这,一般大小端貌似在网络传输中用的多,暂时还没涉及,以后接触了再来补充。。。。
Unicode编码与大端小端相关推荐
- 字符编码方式及大端小端
参考资料: http://www.cnblogs.com/zhouyuqin/p/4688459.html http://pcedu.pconline.com.cn/empolder/gj/other ...
- socket 大端 小端 转换 (转)《二》
http://blog.csdn.net/kukumouse/article/details/2270356 (1)对于位域结构中的变量来说,其长度不能跨越字节,也就是说不能超过8位.当然如果设置空白 ...
- C语言中低位存放,C语言 大端小端存储解析以及判断方法
当我们在C语言中查看数据在内存中的存储时,我们经常会发现一个很奇怪的现象,什么现象呢? 例如下面这段代码 int main() { int i = 1; return 0; } 数据在内存中的存放方式 ...
- C语言程序设计 | 大端小端存储解析以及判断方法
当我们在C语言中查看数据在内存中的存储时,我们经常会发现一个很奇怪的现象,什么现象呢? 例如下面这段代码 int main() {int i = 1;return 0; } 数据在内存中的存放方式似乎 ...
- C/C++之大端小端
如果有一个变量 unsigned int a=0x12345678; 大端Big-Endian:高字节在前 12 34 56 78 小端Little-Endian:低字节在前 78 56 34 12 ...
- 彻底弄懂计算机中的大端小端
大端与小端这个问题在做和其他设备交换原始字节数据的时候是非常重要的概念,也是必须要掌握的内容,但是很多人就是仅仅是稍微有些了解,但每次真正去做东西的时候,还是要花半天去想,博主就是这样的人,出现这样问 ...
- 栈增长方向与大端/小端问题
转:http://www.cnblogs.com/xkfz007/archive/2012/06/22/2558935.html 栈增长和大端/小端问题是和CPU相关的两个问题. 在内存管理中,与栈对 ...
- 大端小端与MSB和LSB
大端(Big-endian):数据的高位字节存放在地址的低端 低位字节存放在地址高端: 小端(Little-endian):数据的高位字节存放在地址的高端 低位字节存放在地址低端: 举个简单而又容易理 ...
- Java代码测试大端小端
Java果真强大,神马功能的函数都能找到,测试大端小端只需一句话: if(ByteOrder.nativeOrder()==ByteOrder.BIG_ENDIAN)System.out.printl ...
最新文章
- [转]Flask --- 框架快速入门
- 高地址和低地址、高字节低字节、大小端模式的转换,存储顺序
- android开发技术探索,《android开发艺术探索》读书笔记(十三)--综合技术(示例代码)...
- 【专栏必读】王道考研408数据结构万字笔记(有了它不需要你再做笔记了):各章节内容概述导航和思维导图
- jquery.treeview.js php mysql,jquery.treeview应用
- linux硬盘系统安装教程图解,Linux操作系统添加安装新硬盘的方法图解
- 提醒!赶快弃掉这个区块链平台!
- [JarvisOj][XMAN]lTell Me Something
- 干货 | 各大AI研究院共35场NLP算法岗面经奉上
- 微分方程matlab绘图,用matlab解微分方程组并作图
- 伊斯坦布尔之旅第一天:蓝色清真寺和圣索菲亚博物馆
- python matplotlib pColor 网格线 消除
- php架构师培训,php架构师培训效果怎么样
- 关于监听Android的静音键以及音量按键
- java gzip 压缩解压工具类
- c语言整数各位数字求和
- javascript农历日历(转载)
- 在我女儿的五个学校作业问题上测试 ChatGPT
- 求最大最小值(分治法)
- windows 分页缓冲池 非分页缓冲池