我正在尝试将一串十六进制转换为一个长序列。这是 Cryptopals 挑战中挑战 1 的一部分(将十六进制转换为 base64)。
我的想法是将字符串中的每两个字符转换为其数值的一个字符(同时将第一个乘以 16),因为 |hex| = 4,|字符|=8。
然后,每次屏蔽前 6 位,并将它们转换为 base64。
问题是,在前 6 位之后,我需要将所有数组左移 6 次 - 显然 - 我不知道该怎么做。
那么,作为开始,它们是否有更好的方法将十六进制字符串表示为位序列?
而且 - 我怎样才能将所有数组左移?我在这里看到了处理移动每个元素并复制它们的解决方案——这是最简单的方法吗?
这是我到目前为止所做的 - 我添加了一些额外的步骤来澄清:
int main(int argc, char * argv[]) {
int elm = strlen(argv[1]) / 2;
char *hashBits = malloc(sizeof(char) * elm);
char a,b,c;
for (int i = 0; i < elm; ++i) {
a = charToBinary(argv[1][i*2]); // Convert the char to its numeric value
b = charToBinary(argv[1][i*2+1]);
c = transformToChar(a,b); // multiply the first with 16 and adds the second one
hashBits[i] = c;
}
char base64Bits = 63 << 2;
int elm64 = elm * 2 * 4 / 6;
char *hashIn64Base = malloc(sizeof(char) * elm64);
for (int j = 0; j < elm64; ++j) {
hashIn64Base[j] = toBaseSixtyFour((hashBits[0] & base64Bits) >> 2);
hashBits = hashBits << 6; //***This is obviously wrong but - how to do it?***//
}
for (int k = 0; k < elm64; ++k) {
printf("%s", &hashIn64Base[k]);
}
}