这是什么原理?我函数也编的没问题,为什么就失败了?(语言-c语言)

输出前面4个都没问题,到最后一个data就是0了。按理来说我不应该失败的。

#include 
#include 
#include 
#include 
#include 

typedef unsigned int _DWORD;
typedef unsigned char _BYTE;

void * xxtea_to_uint_array(const void *a1, size_t a2, int a3, size_t *a4)
{
  size_t v4; // r5
  void *v8; // r0
  void *v9; // r12

  v4 = a2 >> 2;
  if ( (a2 & 3) != 0 )
    ++v4;
  if ( a3 )
  {
    v8 = calloc(v4 + 1, 4u);
    v9 = v8;
    if ( v8 )
    {
      *((_DWORD *)v8 + v4) = a2;
      *a4 = v4 + 1;
      return memcpy(v9, a1, a2);
    }
  }
  else
  {
    v9 = calloc(v4, 4u);
    if ( v9 )
    {
      *a4 = v4;
      return memcpy(v9, a1, a2);
    }
  }
  return 0;
}

_BYTE * xxtea_decrypt(int a1, int a2, int *a3, size_t *a4)
{
  int v7; // r0
  int v8; // r1
  int v9; // r12
  int v10; // r2
  int v11; // r3
  unsigned int *v12; // r8
  int v13; // r0
  void *v14; // r9
  unsigned int v15; // r5
  unsigned int v16; // r4
  int v17; // r10
  unsigned int v18; // lr
  unsigned int v19; // r6
  unsigned int *v20; // r2
  int v21; // r3
  int v22; // r7
  int v23; // r1
  size_t v24; // r4
  void *v25; // r0
  _BYTE *v26; // r0
  _BYTE *v27; // r5
  _DWORD *v29; // r3
  unsigned int v31; // [sp+8h] [bp-40h] BYREF
  char v32[4]; // [sp+Ch] [bp-3Ch] BYREF
  _DWORD v33[3]; // [sp+10h] [bp-38h] BYREF
  int v34; // [sp+1Ch] [bp-2Ch] BYREF

  v7 = *a3;
  v8 = a3[1];
  v9 = 0;
  v10 = a3[2];
  v11 = a3[3];
  v33[0] = v7;
  v33[1] = v8;
  v33[2] = v10;
  v34 = v11;
  while ( *((_BYTE *)v33 + v9) )
  {
    if ( ++v9 == 16 )
      goto LABEL_4;
  }
  if ( v9 == 15 )
  {
LABEL_4:
    if ( !a2 )
      return 0;
  }
  else
  {
    v29 = (_DWORD *)((char *)v33 + v9);
    do
    {
      *((_BYTE *)v29 + 1) = 0;
      v29 = (_DWORD *)((char *)v29 + 1);
    }
    while ( v29 != (int *)((char *)&v34 + 3) );
    if ( !a2 )
      return 0;
  }
  v12 = (unsigned int *)xxtea_to_uint_array(a1, a2, 0, &v31);
  if ( !v12 )
    return 0;
  v13 = xxtea_to_uint_array(v33, 16, 0, v32);
  v14 = (void *)v13;
  if ( v13 )
  {
    v15 = v31;
    v16 = *v12;
    v17 = v31 - 1;
    if ( v31 != 1 )
    {
      v18 = -1640531527 * (0x34 / v31 + 6);
      if ( v18 )
      {
        do
        {
          v19 = v18 >> 2;
          v20 = &v12[v17 + 1];
          v21 = v17;
          do
          {
            v22 = *(_DWORD *)(v13 + 4 * (((unsigned char)v21-- ^ (unsigned char)v19) & 3));
            v16 = *(v20 - 1)
                - (((*(v20 - 2) ^ v22) + (v16 ^ v18)) ^ (((v16 >> 3) ^ (16 * *(v20 - 2)))
                                                       + ((4 * v16) ^ (*(v20 - 2) >> 5))));
            *--v20 = v16;
          }
          while ( v21 );
          v23 = v16 ^ v18;
          v18 += 1640531527;
          v16 = *v12
              - ((((16 * v12[v17]) ^ (v16 >> 3)) + ((v12[v17] >> 5) ^ (4 * v16))) ^ (v23
                                                                                   + (v12[v17] ^ *(_DWORD *)(v13 + 4 * (v19 & 3)))));
          *v12 = v16;
        }
        while ( v18 );
        v15 = v31;
      }
    }
    v24 = v12[v15 - 1];
    if ( v24 < 4 * v15 - 7 || v24 > 4 * v15 - 4 )
    {
      v27 = 0;
    }
    else
    {
      v25 = malloc(v24 + 1);
      v26 = memcpy(v25, v12, v24);
      *a4 = v24;
      v27 = v26;
      v26[v24] = 0;
    }
    free(v12);
    free(v14);
  }
  else
  {
    v27 = 0;
    free(v12);
  }
  return v27;
}

int main(int argc, const char **argv) {
    
    if(argc != 3) {
    printf("usage:%s  \n", argv[0]);
    return -1;
    }  

    FILE *fpDll;  
    fpDll = fopen(argv[1], "r");  
    if(fpDll == NULL)  
    {  
        printf("open  fail\n");  
    }  
    fseek(fpDll, 0, SEEK_END);  
    int len = ftell(fpDll);  
    fseek(fpDll, 0, SEEK_SET);  
    char * data= (char *)malloc(len);  
    fread(data, 1, len, fpDll);  
    fclose(fpDll);  
 
  char kkk[14]={'"','a','b','c','d','e','f','&','幸','运','"',',','0','\0'};
  void *Key=&kkk;
  
  printf("a1终于成功了==========decrypted=========%d\n",data);
  printf("n终于成功了==========decrypted=========%d\n",len);
  printf("Key终于成功了==========decrypted=========%d\n",Key);
  printf("&n终于成功了==========decrypted=========%d\n",&len);
  
  data = (char *)xxtea_decrypt(data, len, Key, &len);
  printf("输出终于成功了==========decrypted=========%d\n",data);
   FILE* pFile = fopen(argv[2],"wb");  
    fwrite(data,len,1,pFile);  
    fclose(pFile);     

/* 我的第一个 C 程序 */
   printf("Hello, World! \n");
   
   return 0;
}