一次复制struct 8个字节

时间:2014-07-22 03:44:38

标签: c encryption struct arduino memcpy

我在arduino环境中工作。我有一个结构定义如下。该结构最终将被加密并通过无线电链路层无线发送。它长达32个字节。

struct SENSORTYPE{
  int sensor1:8;
  int sensor2:8;
  int sensor3:8;
  int sensor4:8;
};

struct SENSOR{
  float sensor1;
  float sensor2;
  float sensor3;
  float sensor4;
};

struct HEADER{
  byte type;
  short id;
  short to;
  short from;
  byte version;
  long _buff;
  SENSORTYPE sensortype;
  SENSOR sensor;
};

HEADER header;

我有一个XTEA加密/解密例程,其定义如下,并经过验证可以正常工作。它在两个32位块上运行。

void xteaEncrypt( unsigned long v[2])
void xteaDecrypt(unsigned long v[2])  

我要做的是通过xteaEncrypt运行header。我正在将我的结构转换为两个32位数字。以下是我到目前为止的情况。

#define BLOCK_SIZE 8
header.type = 1;                      //test value
header._buff = 1;                     //test value
byte data[BLOCK_SIZE];                //8 byte buffer to encrypt/decrypt
byte buff[32];                        //32 byte buffer to put encrypted/decrypted data into

for (uint32_t i = 0; i < 4; i++){     //4 times (4 * 8 = 32)
   memcpy(data, &header+(i*BLOCK_SIZE), BLOCK_SIZE);     //copy 8 bytes from header struct into data
   xteaEncrypt((uint32_t*)data);         //encrypt data
   memcpy(&buff+(i*8), data, BLOCK_SIZE); //put encrypted data into the new buffer
}
memcpy(&header, &buff, sizeof(header));  //copy into original header for convenience

//now decrypt it back
for (uint32_t i = 0; i < 4; i++){
   memcpy(data, &header+(i*BLOCK_SIZE), BLOCK_SIZE);
   xteaDecrypt((uint32_t*)data);
   memcpy(&buff+(i*8), data, BLOCK_SIZE);
}
memcpy(&header, &buff, sizeof(header));

加密后header.type = 0xee和header._buff = C0010000。解密后,header.type = 1和_buff仍然= C0010000所以看起来我的memcpy'ing有一个错误,但我找不到它。任何帮助将不胜感激。这个对我来说特别难以调试。如果我对此完全错误,请告诉我并指出正确的方向。

1 个答案:

答案 0 :(得分:1)

你被指针运算绊倒了。请考虑代码段&header+(i*BLOCK_SIZE)。您显然希望发生的是,您将获得一些地址,我们称之为addr,然后在其中添加一些小数字来计算新地址,即

finalAddress = addr + (i * 8);

但是因为&header是指向struct HEADER的指针,编译器所做的实际计算是

finalAddress = addr + (sizeof(struct HEADER) * i * 8);

结果是一个远远超过任何i大于0的标题末尾的地址。&buff+(i*8)发生同样的事情,因为&buff是指向32的指针字节。

要解决此问题,我建议使用char *的中间变量,例如

char *headAddress = (char *)&header;
char *buffAddress = (char *)&buff;
for (uint32_t i = 0; i < 4; i++)
{
    memcpy(data, headAddress+(i*BLOCK_SIZE), BLOCK_SIZE);
    xteaEncrypt((uint32_t*)data);
    memcpy(&buffAddress+(i*BLOCK_SIZE), data, BLOCK_SIZE);
}