【问题标题】:Why both utf-16le and utf-16be exists? endianness efficiency - C为什么 utf-16le 和 utf-16be 都存在?字节序效率 - C
【发布时间】:2010-07-27 12:49:59
【问题描述】:

我想知道为什么 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 酒吧

【问题讨论】:

    标签: c endianness


    【解决方案1】:

    这允许代码在不进行转换的情况下写入大量 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);
    

    【讨论】:

    • 感谢您的快速响应,您是否有机会向我展示如何将 2 字节 var 本地转换为 2 个八位字节的基本示例? (忽略字节顺序,仅供本地使用)
    • 如果我错了,请纠正我 - 但根据你的回答,我认为我的代码确实效率低下。 (仅供本地使用)
    • 当您使用它来将 unicode 数据写入文件时,您的代码效率低下(除非您必须使用 utf16-le 作为编码)。
    • 这是最有效的方法吗? codepad.org/4lESCv0G ,还是我错了?
    • 误解 :-) 如果您需要转换 16 位本机 Unicode -> UTF-16LE,您的代码是高效的。我是说你应该尽量避免转换。
    猜你喜欢
    • 1970-01-01
    • 2020-11-07
    • 2021-05-10
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    相关资源
    最近更新 更多