首先我要说的是,我公开承认这是一项家庭作业,但我所要求的与作业的目的无关,只是我在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
。我知道char
是1byte
,并且该值也可以表示为与其ascii值相关的数字,但不确定如何在两者之间进行转换,因为某些字母具有3位ascii值和其他人有2.
我尝试使用sprintf
从数据集中获取8byte
块,并将该值存储在uint32_t[2]
变量中。它有效,但后来我失去原来的char array
,因为我无法找到回去/撤消它的方法。
我知道必须有一种相对简单的方法来做到这一点,我只是缺乏足够的C
技能才能实现这一目标。
答案 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);
}
然后使用相同的结构转换回来。
当然必须注意填充/对齐,你也不提及它是否是通过网络等发送的,所以还有其他因素需要考虑。