【发布时间】:2020-06-16 05:14:52
【问题描述】:
我正在尝试在不使用数组或字符串的情况下创建加密算法,因为这些是我正在处理的分配规则。正因为如此,我在试图找出一种使用算法的方法时遇到了很多问题。
基本上,用户必须输入 24 位二进制文本。例如:'010000010100000101000001' 该算法应该与密钥'01000001'进行XOR运算并将结果的位分成3个8位部分,并找到8位部分的二进制代码的十进制值。然后将它们分别转换为 ASCII 字符。
我想到的方法是定义一个值为 1000000000000000000000000(24 个零)的整数,这样输入的零就不会在前面消失。然而,因为数字很大,所以 '010000010100000101000001' 的输入变成了 '947938113'
我让程序打印输入看看:(输入是'010000010100000101000001')
#include <stdio.h>
#include <math.h>
int main(){
int count,tot,cho,key=1010000010100000101000001,temp,encry_tex;
char;
printf("Which base will you use to enter text (base 16/2)?");
scanf("%d",&cho);
temp=1000000000000000000000000;
if (cho==2)
{
printf("Please enter the text to encrypt: ");
scanf("%d",&encry_tex);
tot=temp+encry_tex; /* this part is not important, that's how the
program was supposed to go but they don't mean
anything to the question im asking. */
tot=tot+key;
printf("%u",encry_tex);
}
}
如果我输入 10001001 这样的输入,它仍然给我 10001001,当数字变大时就会出现问题。
我该如何解决这个问题?
【问题讨论】:
-
在大多数系统上,
int是 32 位的,最大值约为 20 亿。 64 位无符号数的最大值约为 1.8e19。分配给temp的数字在1 之后有24 个零,因此它不适合C 编译器支持的任何类型。为此,您需要一个大整数库。另一种方法是以十六进制输入数字,或以 3 个单独的 8 位二进制数字形式输入。 -
编译器没有警告你
temp=1000000000000000000000000;吗?这应该。如果没有,您需要更多编译器警告选项(尽管没有必要从中获得警告),或者您需要获得更好的编译器。当你在学习 C 时(30 多年后我还在学习),假设编译器比你知道更多的 C。如果它打算警告您,请将其视为错误。并确保它为您提供尽可能多的帮助。如果您使用 GCC,gcc -O3 -g -Wall -Wextra -Werror是一个不错的起点。在我愿意运行程序之前,我会使用这些选项和更多选项。 -
您也可以使用
getchar()一次读取一个字符,然后使用 shift<<和 OR|构建数字。 -
如果您尝试输入二进制数,请检查您的编译器是否支持
0b作为前缀(例如0x用于十六进制)。一些编译器会这样做;有些没有。该符号是现代 C++(C++11 或 C++14,IIRC)的一部分。它不是标准 C 的一部分。 -
另一种方法是将二进制数组定义为字符串,并使用
strtol()或strtoll()将其转换为整数类型。