如何将纪元十进制时间转换为64位二进制并在C中返回到十进制

时间:2014-09-15 19:04:13

标签: c binary epoch

我正在尝试创建一个脚本,它将根据指定的大小将小数转换为二进制,然后反转该过程,即从二进制到十进制。到目前为止,脚本和我的观点(初学者)输出的脚本看起来是正确的。我可以将所有数字从十进制转换为二进制,反之亦然。我在最后一部分堆栈,我试图将纪元时间从64位二进制数转换为十进制。我无法理解我哪里出错了,因为其余数字似乎恢复正常。我发现我使用的脚本的源点是Binary to DecimalDecimal to Binary

更新:修改后的代码为简短版本:

我修改了代码以简单地演示问题。该代码可以正常工作,最高可达32位二进制转换。但由于我需要转换为64,我不知道该怎么做。我注意到因为我在int之前使用过,所以我达到了32位的最大限制,因此我将其修改为long long int以达到64位。

我提供了一个简单的十进制转换样本,为32位格式的1和64,表明了这个问题。纪元时间是所需的输出,但我需要在尝试转换之前验证代码是否有效。

代码示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <inttypes.h>

#define MAX_CHARACTERS 65

typedef struct rec {
  char transmit[MAX_CHARACTERS];
  char receive[MAX_CHARACTERS];
}RECORD;

char *decimal_to_binary(int n , int num); /* Define function */

char *decimal_to_binary(int n , int num) {

  long long int c, d, count;
  char *pointer;

  count = 0;

  pointer = (char*) malloc( num + 1 );

  if ( pointer == NULL )
    exit(EXIT_FAILURE);

  for ( c = num - 1; c >= 0; c-- ) {

    d = n >> c;

    if ( d & 1 )
      *( pointer + count ) = 1 + '0';
    else
      *( pointer + count ) = 0 + '0';

     count++;
  }
  *( pointer + count ) = '\0';

  return pointer;
}

int binary_decimal(long long int n); /* Define function */

int binary_decimal(long long int n) { /* Function to convert binary to decimal.*/

  int decimal=0, i=0, rem;

  while (n!=0) {

    rem = n%10;
    n/=10;
    decimal += rem*pow(2,i);
    ++i;

  }

  return decimal;

}

int main(void) {

   RECORD *ptr_record;

   ptr_record = (RECORD *) malloc (sizeof(RECORD));

   if (ptr_record == NULL) {
     printf("Out of memmory!\nExit!\n");
     exit(0);
   }

   int LI_d = 1;
   char *LI_b = decimal_to_binary(LI_d,32);

   memset( (*ptr_record).transmit , '\0' , sizeof((*ptr_record).transmit) );
   strncat((*ptr_record).transmit , LI_b , strlen(LI_b) );

   printf("LI: %s\n",(*ptr_record).transmit);

   //transmit and receive

   memset( (*ptr_record).receive , '\0' , sizeof((*ptr_record).receive) );
   strncpy( (*ptr_record).receive , (*ptr_record).transmit , strlen((*ptr_record).transmit) );

   char *LI_rcv_b = strndup( (*ptr_record).receive , 64 );
   int LI_rcv_i = atoi (LI_rcv_b);
   int final_LI = binary_decimal(LI_rcv_i);
   printf("Final_LI: %i\n",final_LI);

   free( ptr_record );

   return 0;

}

32位转换的输出样本:

LI: 00000000000000000000000000000001
Final_LI: 1

64位转换的输出样本:

LI: 0000000000000000000000000000000100000000000000000000000000000001
Final_LI: -1

1 个答案:

答案 0 :(得分:0)

  1. decimal_to_binary(int n, ...):最好使用无符号数学

    //char *decimal_to_binary(int n, int num) {
    char *decimal_to_binary(unsigned long long n, int num) {
      //  long long int c, d, count;
      unsigned long long int d;
      int c, count;
      char *pointer;
    
      count = 0;
      pointer = malloc(num + 1);  // drop cast
      if (pointer == NULL)
        exit(EXIT_FAILURE);
    
      for (c = num - 1; c >= 0; c--) {
        d = n >> c;
        if (d & 1)
          *(pointer + count) = 1 + '0';
        else
          *(pointer + count) = 0 + '0';
        count++;
      }
      *(pointer + count) = '\0';
      return pointer;
    }
    
  2. 简化binary_decimal()。再次使用无符号数学,删除pow()

    /* Function to convert binary to decimal.*/
    unsigned long binary_decimal(unsigned long long int n) { 
      unsigned long decimal = 0;
      while (n != 0) {
        decimal *= 2;
        decimal += n % 10;
        n /= 10;
      }
      return decimal;
    }
    
  3. main()有很多问题

    int main(void) {
      RECORD *ptr_record;
    
      ptr_record = malloc(sizeof(RECORD));  // drop cast
      if (ptr_record == NULL) {
        printf("Out of memory!\nExit!\n"); // spelling fix
        exit(0);
      }
      // use unsigned long long
      unsigned long long LI_d = 1;
      LI_d = (unsigned long long) -1;
      char *LI_b = decimal_to_binary(LI_d, 32);
    
      memset((*ptr_record).transmit, '\0', sizeof((*ptr_record).transmit));
      // strncat((*ptr_record).transmit, LI_b, strlen(LI_b));
      strncat((*ptr_record).transmit, LI_b, sizeof((*ptr_record).transmit) - 1);
    
      printf("LI: %s\n", (*ptr_record).transmit);
    
      //transmit and receive
    
      memset((*ptr_record).receive, '\0', sizeof((*ptr_record).receive));
      // strncpy((*ptr_record).receive, (*ptr_record).transmit, strlen((*ptr_record).transmit));
      strncpy((*ptr_record).receive, (*ptr_record).transmit, sizeof((*ptr_record).transmit) - 1);
    
      // char *LI_rcv_b = strndup((*ptr_record).receive, 64);
      char *LI_rcv_b = strndup((*ptr_record).receive, MAX_CHARACTERS);
    
      // At this point, approach is in error
      // Cannot take a 64-decimal digit string and convert to a typical long long.
      // int LI_rcv_i = atoi(LI_rcv_b);
      // int final_LI = binary_decimal(LI_rcv_i);
      // printf("Final_LI: %i\n", final_LI);
    
      // Suspect you want to convert 64-binary digit string to a 64-bit integer
      // maybe by somehow using binary_decimal - suggest re-write of that function
      unsigned long long LI_rcv_i = strtoull(LI_rcv_b, NULL, 2);
      printf("Final_LI: %llu\n", LI_rcv_i);
    
      free(ptr_record);
      return 0;
    }
    
  4. 输出

    LI:11111111111111111111111111111111
    Final_LI​​:4294967295