C 无符号long-long的二进制表示

C 无符号long-long的二进制表示,c,C,我试图获取无符号long-long的二进制形式,并将其每一位存储在一个数组中 1. 3000000000000000 2. 1000000000000001 我有这样一个输入文件: 0000000000000000 0000000000000000 FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF 3000000000000000 1000000000000001 1. 3000000000000000 2. 1000000000

我试图获取无符号long-long的二进制形式,并将其每一位存储在一个数组中

1.  3000000000000000    2.  1000000000000001   
我有这样一个输入文件:

0000000000000000    0000000000000000
FFFFFFFFFFFFFFFF    FFFFFFFFFFFFFFFF
3000000000000000    1000000000000001
1.  3000000000000000    2.  1000000000000001   
for(i = length - 1; i >= 0; i--)
其中,每个条目都是以十六进制表示的64位整数。我使用了一个无符号的long-long来保存这个值,然后对这些位进行迭代,并试图将它们存储在一个数组中,但是有些数组的位位置不正确

1.  3000000000000000    2.  1000000000000001   
以下是我所拥有的:

char key_in[17];
char plaintext_in[17];

//64-bit long variables to hold the 64-bit hex values in the input file
unsigned long long key, plaintext;

//I read an entry from the file with fscanf
fscanf(infile,"%s %s",&key_in, &plaintext_in)

//convert the numbers from hex to unsigned long long with strtoull
key = strtoull(key_in, NULL, 16);
plaintext = strtoull(plaintext_in, NULL, 16);

//initialize arrays with 64 positions that will hold the 
//binary representation of the key and plaintext
int key_arr[64];
int pt_arr[64];

//fill the arrays with the binary representations
//of the plaintext and the key
int64_to_bin_array(key, key_arr, 64);
int64_to_bin_array(plaintext, pt_arr, 64);    

//print both arrays
printArray(key_arr, 64);
printArray(pt_arr,  64);
1.  3000000000000000    2.  1000000000000001   
以下是我创建的函数
int64_to_bin_array
printArray

/* Converts from an unsigned long long into an array of 
integers that form the binary representation of a */
void int64_to_bin_array(unsigned long long a, int *b, int length)
{
   int i;
   for(i = 0; i < length; i++)
   {
      *(b+i) = (a >> i) & 1; //store the ith bit in b[i]
   }
}

/* prints a one-dimensional array given
   a pointer to it, and its length */
void printArray(int *arr, int length)
{
   int i;
   for(i = 0; i < length; i++)
   {
      printf("%d ", *(arr + i));
   }
   printf("\n\n");
}   
1.  3000000000000000    2.  1000000000000001   
输出(二进制):

1.  3000000000000000    2.  1000000000000001   
有人能看出我哪里出了错吗

1.  3000000000000000    2.  1000000000000001   
编辑

1.  3000000000000000    2.  1000000000000001   

在反向读取和打印之后,我得到了正确的输出,但我的问题是我需要数组首先有它的最高有效字节,这样我才能操作它。你知道怎么做吗?我是否需要将其重新分配到一个新数组并反向复制元素?

尝试以相反的方式读取它。让我们看最后一个八重奏:

1.  3000000000000000    2.  1000000000000001   
00001100 = 0x0C
00110000 = 0x30 <---
对应于第一个八位字节,
0x10

1.  3000000000000000    2.  1000000000000001   
如果按如下方式打印,您可能会得到您期望的结果:

0000000000000000    0000000000000000
FFFFFFFFFFFFFFFF    FFFFFFFFFFFFFFFF
3000000000000000    1000000000000001
1.  3000000000000000    2.  1000000000000001   
for(i = length - 1; i >= 0; i--)

使用
b[i]
而不是
*(b+i)
,更清楚。两个问题:-最低阶位的位号是多少?-打印位时,最低顺序的位是先打印(在左边)还是最后打印(在左边)?@DaleHagglund十六进制值是从一个人创建的文件中读取的,所以它们都应该是big-endian。@Borealid这两种符号之间有什么真正的区别吗?我的问题是想告诉你@cnicutar明确给出的答案。在讨论高阶和低阶位时,Big-endian和little-endian并不重要。低阶位始终是位0,因为2个字节,这正是我的问题。为了使我的程序正常工作,我需要首先使用具有最高有效字节的二进制表示。你知道我怎样才能做到吗?我用当前输出重新编辑了上面的内容。