3

首先让我说我公开承认这是一个家庭作业,但我所问的与作业的目的无关,只是我不明白的东西C。这只是大型程序的一小部分。

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

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

其中每个块代表程序中其他地方的一个变量。我需要8bytes一次将该数据发送到一个接受uint32_t[2]输入的函数中。如何在不丢失值的情况下将我的转换234byte char array为?uint32_tchar

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

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

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

4

3 回答 3

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

如果您需要更改字节顺序或其他内容,那就更复杂了。

于 2014-04-11T16:24:30.333 回答
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; }
于 2014-04-11T16:27:19.140 回答
0

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

你可以为此使用工会

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);
}

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

当然,必须注意填充/对齐,您也没有提到它是否通过网络等发送,因此还有其他因素需要考虑。

于 2014-04-11T18:11:18.227 回答