C中的按位运算伪造文件内容
File contents falsification with bitwise operation in C
我有这个小程序可以从
allomany.txt。它包含一个很长的文本,我们有一些 numbers.Now 我需要伪造每个数字:让我们假设该程序需要从文件中读取文本,我需要找到一个数字(数字是字符串)。然后我需要检查字符串是否是数字。如果是,那么我需要使用按位运算来伪造它。
伪造: 如果我在字符串中找到一个数字(atoi
, sscanf
) 那么我需要增加在字符串中找到的数字。示例:如果程序找到 14,我们使用按位运算将其增加 15。如果我没记错的话,我在网上找到了一个例子:(-(~n))
。如果我不使用按位运算,它就可以工作。
问题:如何使用按位运算来做到这一点?
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fin,*fout;
char *token, s[1000];
fin = fopen("allomany.txt","rt");
fout = fopen("hamisitott.txt","wt");
while (fscanf(fin, "%[^\n]\n", s) != EOF) {
token = strtok(s, " ");
while (token != NULL) {
if (atof(token) > 0)
fprintf(fout, "%g ", atof(token) + 1);
else fprintf(fout, "%s ", token);
token = strtok(NULL, " ");
}
fprintf(fout, "\n");
}
fclose(fin);
fclose(fout);
return EXIT_SUCCESS;
}
用按位运算增加数字似乎位复杂,我建议一个简单的替代方法:通过翻转低位将文件中的每个数字从偶数更改为奇数,反之亦然位:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE *fin = fopen("allomany.txt", "r");
FILE *fout = fopen("hamisitott.txt", "w");
int c;
if (fin == NULL || fout == NULL) {
fprintf(stderr, "cannot open files\n");
exit(EXIT_FAILURE);
}
while ((c = getc(fin)) != EOF) {
if (c >= '0' && c <= '9')
c = '0' + ((c - '0') ^ 1);
putc(c, fout);
}
fclose(fin);
fclose(fout);
return EXIT_SUCCESS;
}
您还可以使用不同的表达式(但不使用按位运算)实现其他数字排列:
c = "9876543210"[c - '0'];
EDIT 我将 c ^= 1
更改为 c = '0' + ((c - '0') ^ 1)
以避免假设 '0'
是偶数。 C 标准仅保证数字 '0'
到 '9'
相邻且严格为正数。
我有这个小程序可以从 allomany.txt。它包含一个很长的文本,我们有一些 numbers.Now 我需要伪造每个数字:让我们假设该程序需要从文件中读取文本,我需要找到一个数字(数字是字符串)。然后我需要检查字符串是否是数字。如果是,那么我需要使用按位运算来伪造它。
伪造: 如果我在字符串中找到一个数字(atoi
, sscanf
) 那么我需要增加在字符串中找到的数字。示例:如果程序找到 14,我们使用按位运算将其增加 15。如果我没记错的话,我在网上找到了一个例子:(-(~n))
。如果我不使用按位运算,它就可以工作。
问题:如何使用按位运算来做到这一点?
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fin,*fout;
char *token, s[1000];
fin = fopen("allomany.txt","rt");
fout = fopen("hamisitott.txt","wt");
while (fscanf(fin, "%[^\n]\n", s) != EOF) {
token = strtok(s, " ");
while (token != NULL) {
if (atof(token) > 0)
fprintf(fout, "%g ", atof(token) + 1);
else fprintf(fout, "%s ", token);
token = strtok(NULL, " ");
}
fprintf(fout, "\n");
}
fclose(fin);
fclose(fout);
return EXIT_SUCCESS;
}
用按位运算增加数字似乎位复杂,我建议一个简单的替代方法:通过翻转低位将文件中的每个数字从偶数更改为奇数,反之亦然位:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE *fin = fopen("allomany.txt", "r");
FILE *fout = fopen("hamisitott.txt", "w");
int c;
if (fin == NULL || fout == NULL) {
fprintf(stderr, "cannot open files\n");
exit(EXIT_FAILURE);
}
while ((c = getc(fin)) != EOF) {
if (c >= '0' && c <= '9')
c = '0' + ((c - '0') ^ 1);
putc(c, fout);
}
fclose(fin);
fclose(fout);
return EXIT_SUCCESS;
}
您还可以使用不同的表达式(但不使用按位运算)实现其他数字排列:
c = "9876543210"[c - '0'];
EDIT 我将 c ^= 1
更改为 c = '0' + ((c - '0') ^ 1)
以避免假设 '0'
是偶数。 C 标准仅保证数字 '0'
到 '9'
相邻且严格为正数。