【问题标题】:Convert array of char[] to byte[] and vice versa? C++将 char[] 数组转换为 byte[] ,反之亦然? C++
【发布时间】:2009-05-18 22:49:15
【问题描述】:

将字符数组转换为字节(反之亦然)的最佳方法是什么?

解决方案:

void CharToByte(char* chars, byte* bytes, unsigned int count){
    for(unsigned int i = 0; i < count; i++)
        bytes[i] = (byte)chars[i];
}

void ByteToChar(byte* bytes, char* chars, unsigned int count){
    for(unsigned int i = 0; i < count; i++)
         chars[i] = (char)bytes[i];
}

【问题讨论】:

    标签: c++ char


    【解决方案1】:

    char 类型是少数几个具有 ANSI 标准所保证的大小并且大小为 1 字节的类型之一。据我所知,C 并没有直接定义类型字节。然而,拥有一个名为 byte 的类型实际上并不是一个字节大小的类型,这简直是太疯狂了。因此,一个简单的演员表应该可以解决问题。

    【讨论】:

    • @soulmerge 是的,但我不确定它是否正式成为标准的一部分。
    【解决方案2】:

    C++ 中没有字节类型,根据标准:

    编辑:

    1.7:

    一个字节至少足够大 包含基本的任何成员 执行字符集并且是 由一个连续的序列组成 位,其数量为 实现定义。

    5.3.3:

    sizeof(char), sizeof(signed char) 和 sizeof(unsigned char) 为 1;这 sizeof 的结果应用于任何其他 基本类型(3.9.1)是 实现定义。

    【讨论】:

    • 实际上,我相信 char 被定义为正好 1 个字节(但至少 8 位)。至少,sizeof(char) 被定义为 1。
    • @Chris:根据标准中的1.7,一个字节被定义为“至少大到足以容纳基本执行字符集的任何成员”,但这可能涉及实现定义的数量位。 char 的大小总是恰好是 1 个这样的“字节”。
    【解决方案3】:

    C++ 中没有字节类型。你可以 typedef 'unsigned char' 到 'byte' 如果这样更好的话。真的,这就是 C++ 中的所有字节 - 一个无符号字符。除此之外,是的,我会投......但这个演员更好:

    unsigned_char_arr[i]= static_cast<unsigned char>(char_arr[i]);
    

    或者...只需使用 char 数组并在需要将其解释为无符号字符时将其强制转换...

    【讨论】:

    • 我很确定static_cast&lt;unsigned char&gt; 会导致编译失败。出于某种原因,C++ 需要reinterpret_cast&lt;unsigned char&gt;reinterpret_cast&lt;byte&gt;。我从来没有真正理解为什么,因为它们的宽度相同,只有潜在的符号会根据位模式而变化。
    • 对于较大的文件,还要考虑几百万次调用 reinterpret_cast&lt;byte&gt; 或等效函数对性能的影响。
    【解决方案4】:

    在您遇到的几乎所有 C++ 实现中,char 恰好是byte 一个八位字节。 C++ 标准不保证这一点,但实际上总是如此。 char 总是至少 8 位,确切的位数由预处理器常量CHAR_BIT 给出。此外,sizeof() 运算符会根据 chars 的数量告诉您对象/类型的大小,而不是 bytes 八位字节的数量,所以如果你在一些奇怪的系统上16 位 char 和 32 位 int,那么 sizeof(int) 将是 2,而不是 4。

    编辑: 用八位字节替换字节。 C 标准保证char 是一个字节,但不保证一个字节是一个八位字节,正好是 8 位。如果您曾经阅读过任何法国技术文献,它们总是使用“octet”而不是“byte”,并且它们有千字节 (KO)、兆字节 (MO) 等,而不是千字节和兆字节。

    【讨论】:

    • “C++ 标准不保证这...” 真的吗?我很确定它是由 C 标准保证的。
    • 在 C++ 中,我们使用 std::numeric_limits::digits 获取 char 中的位数,在 中定义。
    • @Adam,char 的大小由回到 ANSI 89 的标准来保证。这是他们为数不多的类型之一。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    相关资源
    最近更新 更多