我有一个整数数组,int KEY[32],它存储四个字母四边形的二进制表示,例如:
char quadgram[4] = {'T','I','O','N'};
其中字符的二进制表示为:T =>01010100, I =>01001001, 0 =>01001111, N =>01001110. 我把这些二进制数转换成整数数组:
KEY[32] = 01010100010010010100111101001110;
现在我需要将这个KEY转换成它的二进制值I,e:
int KEY_BIN = 1414090574; // in decimal.
我如何完成转换KEY到KEY_BIN?
给定整数数组,您可以遍历它们,将数字按适当的位数进行位移,然后将其与结果值按位或。为了具有良好定义的位移行为,您将希望KEY
是一个无符号整型数组。
工作示例:
#include <stdio.h>
int main() {
unsigned int KEY[32] = {0, 1, 0, 1, 0, 1, 0, 0, 0,
1, 0, 0, 1, 0, 0, 1, 0, 1,
0, 0, 1, 1, 1, 1, 0, 1, 0,
0, 1, 1, 1, 0 };
unsigned int result = 0;
for ( unsigned int i = 0; i < 32; ++i ) {
unsigned int shiftAmount = 32 - i - 1;
unsigned int shifted = KEY[i] << shiftAmount;
result |= shifted;
}
printf( "%un", result ); // Prints 1414090574
}
我已经将这些二进制数转换成整数数组
为什么?这对计算机来说不是一个有用的格式,它只是一个多余的中间步骤。把它去掉,不需要了。
如何在整数中存储值取决于端序,什么是CPU端序?如果我们不首先理解这一点,那么我们就无能为力。
现在你所说的&;literal binary value&;实际上是大端表示,第一个字符存储在最高有效地址。我们可以通过使用位移位将第一个字母始终移动到ms字节来制作端序可移植代码:
#include <stdio.h>
#include <stdint.h>
int main (void)
{
char quadgram[4] = {'T','I','O','N'};
uint32_t val;
val = (uint32_t)quadgram[0] << 24 |
(uint32_t)quadgram[1] << 16 |
(uint32_t)quadgram[2] << 8 |
(uint32_t)quadgram[3] << 0 ;
printf("%dn", val);
}