在c中转换数据类型

时间:2014-04-11 16:10:50

标签: c char type-conversion uint32-t

首先我要说的是,我公开承认这是一项家庭作业,但我所要求的与作业的目的无关,只是我在C中无法理解的。这只是大型项目的一小部分。

所以我的问题是,我有一组包含各种数据类型的数据,如下所示:

[16 bit number][16 but number][16 bit number][char[234]][128 bit number]

其中每个块表示程序中其他位置的变量。 我需要一次将该数据8bytes发送到接受uint32_t[2]作为输入的函数中。如何将234byte char array转换为uint32_t而不会丢失char值?

换句话说,我需要能够稍后从uint32_t版本转换回原来的char array。我知道char1byte,并且该值也可以表示为与其ascii值相关的数字,但不确定如何在两者之间进行转换,因为某些字母具有3位ascii值和其他人有2.

我尝试使用sprintf从数据集中获取8byte块,并将该值存储在uint32_t[2]变量中。它有效,但后来我失去原来的char array,因为我无法找到回去/撤消它的方法。

我知道必须有一种相对简单的方法来做到这一点,我只是缺乏足够的C技能才能实现这一目标。

3 个答案:

答案 0 :(得分:2)

您的问题非常混乱,但我猜您正准备一些需要8字节或2 uint32_t的函数进行加密的数据结构。

您可以将char数组转换为uint32_t,如下所示

#define NELEM 234
char      a[NELEM];
uint64_t  b[(NELEM+sizeof(uint64_t)-1)/sizeof(uint64_t)]; // this rounds up to nearest modulo 4

memcpy(b,a,NELEM);

for(i .. ) {

   encryption_thing(b[i]);

}

or

如果您需要更改endianess或其他内容,那就更复杂了。

答案 1 :(得分:0)

#include <stdint.h>

void f(uint32_t a[2]) {}

int main() {
  char data[234]; /* GCC can explicitly align with this: __attribute__ ((aligned (8))) */
  int i = 0;
  int stride = 8;

  for (; i < 234 - stride; i += stride) {
    f((uint32_t*)&data[i]); }

  return 0; }

答案 2 :(得分:0)

  

我需要一次将8字节的数据发送到接受的函数中   uint32_t [2]作为输入。如何将我的234byte char数组转换为   uint32_t而不会丢失char值?

你可以使用联盟来实现这个

typedef union 
{
  unsigned char arr[128]; // use unsigned char
  uint32_t uints[16]; // 128/8
} myvaluetype;

myvaluetype value;
memcpy(value.arr, your_array, sizeof(value.arr));

说你想一次喂2 uint32_t的原型就像是

foo(uint32_t* p);

您现在可以通过

发送8字节的数据
for (int i = 0; i < 16; i += 2)
{
  foo(myvaluetype.uints + i);
}

然后使用相同的结构转换回来。

当然必须注意填充/对齐,你也不提及它是否是通过网络等发送的,所以还有其他因素需要考虑。

相关问题