C++ 在C语言的16字符数组中连接32位整数块

C++ 在C语言的16字符数组中连接32位整数块,c++,c,arrays,C++,C,Arrays,我有以下数据类型的结果缓冲区: char result[16]; 问题是,结果是在4个32位的块中计算的 每个,都需要分配给128位结果字符 int res_tmp[0] = 0x6A09E667; int res_tmp[1] = 0x6A09E612; int res_tmp[2] = 0x6A09E432; int res_tmp[3] = 0x6A09E123; 理想情况下,C中应该有类似于串联运算符的东西,例如 result = res_tmp[0] || res_tmp[1]

我有以下数据类型的结果缓冲区:

 char result[16];
问题是,结果是在4个32位的块中计算的 每个,都需要分配给128位结果字符

int res_tmp[0] = 0x6A09E667;
int res_tmp[1] = 0x6A09E612;
int res_tmp[2] = 0x6A09E432;
int res_tmp[3] = 0x6A09E123;
理想情况下,C中应该有类似于串联运算符的东西,例如

result = res_tmp[0] || res_tmp[1] || res_tmp[2] || res_tmp[3];
最后,结果需要通过套接字发送,如下所示:

while((connection_fd = accept(socket_fd, 
                          (struct sockaddr *) &address,
                          &address_length)) > -1)
{
  n = write(connection_fd, result, strlen(result));
  if (n < 0) printf("Error writing to socket\n");            
  close(connection_fd);
  break;  
}
有人知道在128 bir结果字符中连接32位字的最简单语法吗

谢谢,
Patrick

基本上,标准技术是创建一个int指针并将其指向char数组,然后使用它将数据写入。像这样的

int temp_res[4]; //the calculated ints
char result[16]; //the target buffer
int *ptr=(int *)result;
for (int i=0;i<4;i+=1) {
  *ptr=temp_res[i];
  ptr++; //move up a int size because ptr is an int type
}

基本上,标准技术是创建一个int指针并将其指向char数组,然后使用它将数据写入。像这样的

int temp_res[4]; //the calculated ints
char result[16]; //the target buffer
int *ptr=(int *)result;
for (int i=0;i<4;i+=1) {
  *ptr=temp_res[i];
  ptr++; //move up a int size because ptr is an int type
}
为什么不直接使用memcpy呢

还要注意,strlen用于以null结尾的字符串,您应该使用sizeof作为静态缓冲区:

n = write(connection_fd, result, sizeof(result));
当然,你可以发送res_tmp

为什么不直接使用memcpy呢

还要注意,strlen用于以null结尾的字符串,您应该使用sizeof作为静态缓冲区:

n = write(connection_fd, result, sizeof(result));
当然,你可以发送res_tmp

您必须确定char数组是以大端还是小端顺序表示结果。如果处理器和数组的端点恰好重合,则可以使用并集:

那你就根本不需要复制了

如果需要处理器的相反端,可以使用

您必须确定char数组是以大端还是小端顺序表示结果。如果处理器和数组的端点恰好重合,则可以使用并集:

那你就根本不需要复制了

如果需要处理器的相反端,可以使用


我们谈论的是位还是字节?你认为char[128]是什么意思?很好,结果char应该是128位,也就是16字节。很抱歉造成混淆:strlen对于计算结果数组的长度是一个错误的选择。试试sizeof result,甚至是16。我真的不明白这个问题。字节、位、字符、整数?你到底想做什么?我们是在谈论位还是字节?你认为char[128]是什么意思?很好,结果char应该是128位,也就是16字节。很抱歉造成混淆:strlen对于计算结果数组的长度是一个错误的选择。试试sizeof result,甚至是16。我真的不明白这个问题。字节、位、字符、整数?你到底想做什么?指针算法:你用ptr++移动一个sizeofint字节的指针,如果你说ptr+=sizeofint,而你的机器上的int是4个字节,你将它移动4个位置,总共16个字节。int*ptr=int*结果导致未定义的行为,与Ramy Al-Zuhouri的回答相同。@bames53没有机会提问,因为问题被删除了,我想知道一个例子,说明char数组的对齐方式如何不同于int数组,感谢您提供的信息:@mux问题是,一般来说,无法保证一种类型的对象的存储适合不同类型的对象。字符c[sizeofint];可能合法地生成未对齐int的数组。不同的编译器在强制对齐时表现出不同程度的攻击性:。gcc似乎很有攻击性,msvc较少,因此,除非标准或课程要求,否则clang不倾向于过度对齐字符数组,而是提供了-Wcast align警告。指针算法:使用ptr++,如果您说ptr++=sizeofint,并且机器上的int为4字节,则将sizeofint字节的int指针移开,将其总共移动4个位置和16个字节。int*ptr=int*结果会导致未定义的行为,与Ramy Al-Zuhouri的回答相同。@bames53没有机会提问,因为问题已被删除,我想知道一个例子,说明char数组的对齐方式如何不同于int数组,感谢您提供的信息:@mux问题是,一般来说,无法保证一种类型的对象的存储适合不同类型的对象。字符c[sizeofint];可能合法地生成未对齐int的数组。不同的编译器在强制对齐时表现出不同程度的攻击性:。gcc似乎很有攻击性,msvc较少,clang没有显示过度对齐字符数组的倾向,除非标准或课程要求,而是提供了-Wcast align警告。为什么不使用简单的指针呢?他不需要复制内存。@RamyAlZuhouri我想我在最后一行中说过,为什么不使用一个简单的指针呢?他不需要复制记忆。@RamyAlZuhouri我想我在最后一行说了
union myunion
{
    char result[16];
    int res_tmp[4];
};
for (i = 0; i < 4; i ++) res_tmp[i] = htonl(res_tmp[i]);