我想知道为什么utf-16le和utf-16be都存在?是否认为大端环境处理小端数据是“低效”的?
目前,这是我在本地存储2个字节var时使用的内容:
unsigned char octets[2];
short int shotint = 12345; /* (assuming short int = 2 bytes) */
octets[0] = (shortint) & 255;
octets[1] = (shortint >> 8) & 255);
我知道在本地存储和读取固定字节顺序时 - 没有端序风险。我想知道它是否被认为是“效率低下”?什么是最有效的方式来存储2字节变量? (同时将数据限制为环境的字节序,仅限本地使用。)
谢谢,Doori Bar
答案 0 :(得分:2)
这允许代码将大量的Unicode数据写入文件而不进行转换。在加载过程中,您必须始终检查结束。如果你很幸运,你不需要转换。因此,在66%的情况下,您不需要转换,只有33%您必须转换。
在内存中,您可以使用CPU的本机数据类型访问数据,从而实现高效处理。
这样,每个人都可以尽可能地快乐。
因此,在您的情况下,您需要在加载数据时检查编码,但在RAM中,您可以使用short int
数组来处理它。
[编辑]将16位值转换为2个八位字节的最快方法是:
char octet[2];
short * prt = (short*)&octet[0];
*ptr = 12345;
现在你不知道octet[0]
是低8位还是高8位。要找到它,写一个已知值然后检查它。
这将给你一个编码;你本地的一个CPU。
如果您需要其他编码,您可以在将八位字节写入文件(即写入octet[1],octet[0]
)或代码时交换八位字节。
如果你有几个八位字节,你可以使用32位整数一次交换两个16位值:
char octet[4];
short * prt = (short*)&octet[0];
*ptr ++ = 12345;
*ptr ++ = 23456;
int * ptr32 = (int*)&octet[0];
int val = ((*ptr32 << 8) & 0xff00ff00) || (*ptr >> 8) & 0x00ff00ff);