将无符号长整型转换为字符数组

4
这是我的代码示例:

这是我的代码示例:

/* Standard Linux headers */


/* --------------------------------------------------------------------------
Calculates the CRYPTO 
-------------------------------------------------------------------------- */
unsigned long CalculateCRYPTO(
unsigned long ulCount, /* Number of bytes in the data block */
unsigned char *ucBuffer )  /*Data block*/
{
    unsigned long ulCRYPTO = 0;
    //fonction that i have not coded ...
    return( ulCRYPTO );

}


int main (void)
{

  /*Variables and socket programming*/

   //this is my datablock must be in hexa AA 35 07 (will chnage size and data but for now it's hardcoded)
    unsigned char datablock[3];
    memset(datablock, '\0' ,sizeof(datablock));
    datablock[0]=0xaa;
    datablock[1]=0x35;
    datablock[2]=0x07;

    unsigned long CRYPTO;
    CRYPTO=CalculateCRYPTO(sizeof(datablock),datablock); //calculate crypto depending of datablocks
    printf("CRYPTO = 0x%08x \n", CRYPTO); //prints me 0xe8ba8fa3 that is what i want 

    /*Creating the final command*/
    //(will chnage size and data but for now it's fixed)
    unsigned char cmd_final_hex[7]; //this needs to be DATABLOCKS+CRYPTO
                                    //in hexa AA 35 07 concatenated to inverted CRYPTO so ... A3 8F BA E8 => must be AA 35 07 A3 8F BA E8
    memset(cmd_final_hex, '\0' ,sizeof(cmd_final_hex));     //Make sure cmd final is at 0
    memcpy(cmd_final_hex, datablock, sizeof(datablock));    //cmd at datablock + 000
    // while loop prints me what i want so cmd_final_hex[]=AA 35 07 00 00 ...

    //Now i want to concatenate so my idea is to use memcpy and not strcat :
    memcpy(&cmd_final_hex[sizeof(datablock)], &CRYPTO, 4);

   //and a print gives me AA 35 07 A3 8F BA E8 which is exactly what i want but why do i have to use "&CRYPTO" and not "CRYPTO" in my memcpy. !!!

  return 0;


}

我的问题是,为什么最后一个memcpy能够工作?我期望的是将CRYPTO而不是&CRYPTO放入参数中...对我来说,CRYPTO是我想要的值0xe8ba8fa3,&CRYPTO是地址。对我来说,CRYPTO不是指针,所以为什么我需要使用&CRYPTO进行memcpy才能使其工作?
顺便说一下,我的代码可能是纯灾难,我是初学者。请不要犹豫,纠正我!
谢谢!

2
做出一个[MCVE]的过程中你做得非常好!但是,我觉得它还有改进的空间。仍然有一些与你的问题无关的部分。这就是我认为更好的MCVE应该是什么样子:https://pastebin.com/3QcR7bLi - bolov
2个回答

6
我的问题是,为什么这个最后的memcpy有效?我希望放入CRYPTO而不是&CRYPTO作为参数...对我来说,CRYPTO是我想要的值0xe8ba8fa3,&CRYPTO是地址。 你是正确的。CRYPTO不是指针。但是, memcpy需要一个指针,所以我们必须给它一个指针。我们通过取CRYPTO的地址来做到这一点,这是通过添加&来完成的,因此是&CRYPTO。 memcpy的作用是将内存从一个地址复制到另一个地址(这就是为什么它需要两个指针),而不考虑这些地址上实际的内容。如果您给它的是CRYPTO而不是指向它的指针,它可能会将CRYPTO的值解释为地址(行为未定义,除非编译器给出保证,否则无法保证会发生什么)。

好的!谢谢!所以如果我理解正确,&CRYPTO可以被用作CRYPTO的指针,因为它包含了CRYPTO的地址? - HacHac
没问题,很高兴能帮到你。 - Blaze
1
如果你给它CRYPTO而不是指向它的指针,它会将CRYPTO的值解释为地址--这可能是发生的一件事,但当错误类型在函数调用中传递时,行为是未定义的。 - ad absurdum

1

对于参考

memcpy void * memcpy ( void * 目标, const void * 来源, size_t 数量 );

参数

  • 目标:指向要复制内容的目标数组的指针,类型转换为void*类型的指针。
  • 来源:指向要复制数据的来源的指针,类型转换为const void*类型的指针。
  • 数量:要复制的字节数。size_t是无符号整数类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接