将C++字节数组转换为C字符串

7

我想在C中将一个字节数组转换为字符串,但我还无法完全弄清楚。

我有一个在C++中适用的示例,但我需要将其转换为C。

以下是C++代码:

#include <iostream>
#include <string>

typedef unsigned char BYTE;

int main(int argc, char *argv[])
{
  BYTE byteArray[5] = { 0x48, 0x65, 0x6C, 0x6C, 0x6F };
  std::string s(reinterpret_cast<char*>(byteArray), sizeof(byteArray));
  std::cout << s << std::endl;

  return EXIT_SUCCESS;
}

请问有人能够指导我吗?


4
String 一个带有终止字符'\0'的字节数组。是的,你需要它的大小来容纳它。 - Eugene Sh.
你为什么要定义一个奇怪的 BYTE 类型?这就像是在 C 语言中强加另一种语言的术语,这是不合适的。在 C 语言中,我们称之为 unsigned char 或者如果你喜欢的话可以使用 uint8_t - tadman
3
请确实阅读问题,而不仅仅是代码。提问者给出的是 C++ 代码,但他们想知道如何在 C 中实现相同的功能。 - Konrad Rudolph
2
@Konrad 好的,对不起搞糊涂了。我看错了。 - πάντα ῥεῖ
1
我会添加这两个标签。任何不同意的人请到meta 这里提出,而不是通过编辑来破坏这个问题。 - Lundin
显示剩余9条评论
3个回答

19

C中的字符串以零结束的字节数组。因此,您需要做的就是将该数组复制到一个新缓冲区中,该缓冲区具有足够的空间来放置一个尾随的零字节:

#include <string.h>
#include <stdio.h>

typedef unsigned char BYTE;

int main() {
    BYTE byteArray[5] = { 0x48, 0x65, 0x6C, 0x6C, 0x6F };
    char str[(sizeof byteArray) + 1];
    memcpy(str, byteArray, sizeof byteArray);
    str[sizeof byteArray] = 0; // Null termination.
    printf("%s\n", str);
}

@πάνταῥεῖ 每次更改都会更改我的标签,但第一行指出代码是C++的,而我想要它是C的。这个方法非常有效,并且在能够接受时将接受。 - Dan
7
@tadman这是一个不公平的指控。标签和标题都写明了C语言,问题正文也在讲述C语言。我们(包括我自己!)只是看到C++代码就像被巴甫洛夫条件反射一样忽略了标签和标题中提到的C语言标记(因为我们已经习惯了两种语言之间的混淆),但问题很明确地解释了为什么要包含C++代码以及它如何相关和合法。 - Konrad Rudolph
@KonradRudolph,这里有一些C++代码,但它实际上是一个红鲱鱼,这并不必要。我认为,如果问题中有C++代码,那么它就是一个C++问题,并且应该被标记为这样。如果你只想使用C语言,请直接使用C并处理它,不要去碰C++。 - tadman

2

C字符串以空字符结尾,因此字符串的大小将是数组大小加上一个空字符终止符。然后您可以使用memcpy()来复制字符串,就像这样:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef unsigned char BYTE;

int main(void)
{
  BYTE byteArray[5] = { 0x48, 0x65, 0x6C, 0x6C, 0x6F };

  // +1 for the NULL terminator
  char str[sizeof(byteArray) + 1];
  // Copy contents
  memcpy(str, byteArray, sizeof(byteArray));
  // Append NULL terminator
  str[sizeof(byteArray)] = '\0';

  printf("%s\n", str);    
  return EXIT_SUCCESS;
}

输出:

Hello

在线运行


你缺少了 '\0' - Alexis Wilke
看起来很慢。为什么在复制之前要清空整个缓冲区?此外,strcpy()是不正确的,因为源没有以空字符结尾。 - Alexis Wilke
2
@AlexisWilke 对,我可以使用 memcpy(),它不需要强制转换。确实不需要清除,我只需附加 NULL 终止符,对吗? - gsamaras

0
这是一个演示程序,展示了如何完成该任务。
#include <stdio.h>
#include <string.h>

typedef unsigned char BYTE;

int main(void) 
{
    BYTE byteArray[5] = { 0x48, 0x65, 0x6C, 0x6C, 0x6F };
    char s[sizeof( byteArray ) + sizeof( ( char )'\0' )] = { '\0' };

    memcpy( s, byteArray, sizeof( byteArray ) );

    puts( s );

    return 0;
}

程序输出是:
Hello

请注意,字符数组已被初始化为零。否则,在调用memcpy之后,您必须手动添加终止零。
s[sizeof( s ) - 1] = '\0';

或者

s[sizeof( byteArray )] = '\0';

当字符数组的大小远大于byteArray的大小时,应使用最后一种变体。


1
只有当字符串非常大时,.. = {'\0'} 才会真正浪费。 - Alexis Wilke
@AlexisWilke 所以,正如我所说的,终止零可以手动添加。:) - Vlad from Moscow
1
@gsamaras 不需要,但是这个变量已经在我的答案中显示了。:) - Vlad from Moscow
我以为你指的是byteArray中的s,这是错误的,现在没问题了,我误读了,对不起! :) - gsamaras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接