gpt4 book ai didi

c - 为什么同时存在 utf-16le 和 utf-16be?字节顺序效率 - C

转载 作者:行者123 更新时间:2023-12-01 23:47:41 25 4
gpt4 key购买 nike

我想知道为什么 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 字节 var 的最“有效”方法是什么? (同时将数据限制为环境的字节顺序,仅限本地使用。)

谢谢,Doori 酒吧

最佳答案

这允许代码将大量 Unicode 数据写入到文件中,而无需进行转换。加载期间,您必须始终检查字节顺序。如果你幸运的话,你不需要转换。因此,在 66% 的情况下,您不需要转换,只有 33% 的情况下您必须转换。

在内存中,您可以使用 CPU 的 native 数据类型访问数据,从而实现高效处理。

这样,每个人都可以尽可能快乐。

因此,在您的情况下,您需要在加载数据时检查编码,但在 RAM 中,您可以使用 short int 数组来处理它。

[编辑] 将 16 位值转换为 2 个八位字节的最快方法是:

char octet[2];
short * prt = (short*)&octet[0];
*ptr = 12345;

现在您不知道 octet[0] 是低 8 位还是高 8 位。要找出答案,请编写一个已知值,然后检查它。

这将为您提供其中一种编码;您的 CPU 的 native 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);

关于c - 为什么同时存在 utf-16le 和 utf-16be?字节顺序效率 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3343762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com