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

C++ 转换为C++;将字节数组转换为C字符串,c++,c,arrays,string,C++,C,Arrays,String,我试图用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(r

我试图用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;
}
#包括
#包括
typedef无符号字符字节;
int main(int argc,char*argv[])
{
字节字节数组[5]={0x48,0x65,0x6C,0x6C,0x6F};
std::字符串s(重新解释cast(byteArray),sizeof(byteArray));
C中的std::cout字符串是以零结尾的字节数组。因此,您只需将数组复制到一个新的缓冲区中,该缓冲区中有足够的空间容纳尾随的零字节:

#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);
}
#包括
#包括
typedef无符号字符字节;
int main(){
字节字节数组[5]={0x48,0x65,0x6C,0x6C,0x6F};
char str[(byteArray的大小)+1];
memcpy(str、byteArray、byteArray大小);
str[sizeof byteArray]=0;//空终止。
printf(“%s\n”,str);
}
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);
}
#包括
#包括
typedef无符号字符字节;
int main(){
字节字节数组[5]={0x48,0x65,0x6C,0x6C,0x6F};
char str[(byteArray的大小)+1];
memcpy(str、byteArray、byteArray大小);
str[sizeof byteArray]=0;//空终止。
printf(“%s\n”,str);
}

C字符串以null结尾,因此对于null结尾符,字符串的大小将是数组的大小加上1。然后可以使用复制字符串,如下所示:

#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;
}
#包括
#包括
#包括
typedef无符号字符字节;
内部主(空)
{
字节字节数组[5]={0x48,0x65,0x6C,0x6C,0x6F};
//+1表示空终止符
字符str[sizeof(byteArray)+1];
//复制内容
memcpy(str,byteArray,sizeof(byteArray));
//附加空终止符
str[sizeof(byteArray)]='\0';
printf(“%s\n”,str);
返回退出成功;
}
输出:

你好


C字符串以null结尾,因此对于null结尾符,字符串的大小将是数组的大小加上1。然后可以使用复制字符串,如下所示:

#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;
}
#包括
#包括
#包括
typedef无符号字符字节;
内部主(空)
{
字节字节数组[5]={0x48,0x65,0x6C,0x6C,0x6F};
//+1表示空终止符
字符str[sizeof(byteArray)+1];
//复制内容
memcpy(str,byteArray,sizeof(byteArray));
//附加空终止符
str[sizeof(byteArray)]='\0';
printf(“%s\n”,str);
返回退出成功;
}
输出:

你好


这里有一个演示程序,展示了如何实现这一点

#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;
}
请注意,字符数组是零初始化的。否则,在调用memcpy后,您必须“手动”追加终止零


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

下面是一个演示程序,演示了如何执行此操作

#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;
}
请注意,字符数组是零初始化的。否则,在调用memcpy后,您必须“手动”追加终止零



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

字符串是一个以
'\0'
字符结尾的字节数组。因此,是的,您也需要它的大小来容纳它。您是否缺少空终止符?@Leedinelcrocker请实际阅读问题,而不仅仅是代码。OP有C++代码,但是他们想知道如何在C.@康拉德OK中做同样的事情,抱歉我弄错了。我会添加两个标签。任何人都不同意,把它放到Meta上,而不是用编辑来破坏这个问题。String是一个字节数组,它终止代码< > 0”< /Cord>字符。所以,你也需要它的大小来适应它。请删除一个空的终结符?@ LeeDaNIELCROKER请实际阅读这个问题,而不仅仅是代码。OP有C++代码;但是他们想知道如何在C.@康拉德OK中做同样的事情,抱歉弄乱了。我会读错。我会添加两个标签。任何人都同意把它放到Meta上,而不是用编辑来破坏这个问题。你错过了<代码>。0'
。它看起来很慢。为什么要在复制之前清除整个缓冲区?另外,
strcpy()
是不正确的,因为源代码不是以null结尾的。@AlexisWilke是的,我可以
memcpy()
,也不需要强制转换。确实不需要清除,我可以只附加空终止符,对吗?您缺少
'\0'
。它看起来很慢。为什么在复制之前清除整个缓冲区?另外
strcpy()
是不正确的,因为源代码不是空终止的。@Alexiswillke,我可以只
memcpy()
,它也不需要强制转换。确实不需要清除,我可以添加空终止符,对吗?@πάνταῥεῖ 每一个都改变了我的OP标签。第一行说明了代码是C++的,但是我希望它在C中。able@DanJamesPalmer请不要玩游戏,甚至无意中。如果你想要C,请给我们展示C代码。不要用C++来演示C代码。这是两种不同语言,有不同的工具和方法。适合C++的代码是不是一个混淆两个原因的原因。@ TADMAN是一个不公平的指责。标签上写着C,标题是C,这个问题的主体说C. We(Me包括在内)只是在C++代码中跳过,忽略了标签和标题如巴甫洛夫犬中的C。(因为我们习惯于期望两种语言之间出现错误标记)但是问题清楚地说明了C++代码的原因,以及它是如何相关的和合法的。@ KonradRudolph有一个C++代码,它是一个红色鲱鱼,这是不需要的。我认为如果在问题中存在C++代码,它是定义为C++的问题,应该被标记为这样。