How to perform bitwise file operations on Linux?

I want to do some bitwise operations (e.g. xor two files) in files on Linux, and I have no idea how I can do this. Is there any command for this or not?

Any help would be appreciated.

+8
c ++ linux command bitwise-operators
source share
3 answers

You can map the file to mmap , apply bitwise operations in the displayed memory, and close it.

Alternatively, reading fragments into the buffer, applying an operation to the buffer, and writing to the buffer also work.

Here is an example (C, not C ++; since everything except error handling is the same) that inverts all bits:

#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> int main(int argc, char* argv[]) { if (argc != 2) {printf("Usage: %s file\n", argv[0]); exit(1);} int fd = open(argv[1], O_RDWR); if (fd == -1) {perror("Error opening file for writing"); exit(2);} struct stat st; if (fstat(fd, &st) == -1) {perror("Can't determine file size"); exit(3);} char* file = mmap(NULL, st.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (file == MAP_FAILED) { perror("Can't map file"); exit(4); } for (ssize_t i = 0;i < st.st_size;i++) { /* Binary operation goes here. If speed is an issue, you may want to do it on a 32 or 64 bit value at once, and handle any remaining bytes in special code. */ file[i] = ~file[i]; } munmap(file, st.st_size); close(fd); return 0; } 
+9
source share

A quick Internet search revealed Monolith , an open source program for XORing two files. I found it because Bruce Schneier wrote about it, and the goals for this seem to be legal.

+2
source share

Thanks to phihag, this code is designed to perform binary operations on 2 files.
Example 1. You have two files and you want to compare them, so you make binary XOR.
Example 2. You downloaded a file with jdownloader or sth like, and you transferred the incomplete download to another folder, and then the download manager continues the incomplete parts and creates another file. So you have two seprate files that can complement each other. Now, if you are doing binary OR code for these two files, you have the full file.

WARNING: a larger file will be overwritten with the result of the operation.

 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> #include <string.h> int main(int argc, char* argv[]) { int FP1 = 0, FP2 = 0; struct stat St1, St2; char *File1 = NULL, *File2 = NULL; int Rn = 0; if (argc != 4) { printf("Usage: %s File1 File2 Operator\n", argv[0]); exit(1); } //Opening and mapping File1 FP1 = open(argv[1], O_RDWR); if (FP1 == -1) { perror("Error opening file1 for writing"); exit(2); } if (fstat(FP1, &St1) == -1) { perror("Can't determine file1 size"); exit(3); } File1 = (char*) mmap(NULL, St1.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, FP1, 0); if (File1 == MAP_FAILED) { perror("Can't map file1"); exit(4); } //====================== //Opening and mapping File2 FP2 = open(argv[2], O_RDWR); if (FP2 == -1) { perror("Error opening file2 for writing"); exit(2); } if (fstat(FP2, &St2) == -1) { perror("Can't determine file2 size"); exit(3); } File2 = (char*) mmap(NULL, St2.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, FP2, 0); if (File2 == MAP_FAILED) { perror("Can't map file2"); exit(4); } //====================== //Binary operations ssize_t i = 0; switch (*(argv[3])) { case '|': if (St1.st_size <= St2.st_size) for (i = 0; i < St1.st_size; i ++) File2[i] = File1[i] | File2[i]; else for (i = 0; i < St2.st_size; i ++) File1[i] = File1[i] | File2[i]; break; case '&': if (St1.st_size <= St2.st_size) for (i = 0; i < St1.st_size; i ++) File2[i] = File1[i] & File2[i]; else for (i = 0; i < St2.st_size; i ++) File1[i] = File1[i] & File2[i]; break; case '^': if (St1.st_size <= St2.st_size) for (i = 0; i < St1.st_size; i ++) File2[i] = File1[i] ^ File2[i]; else for (i = 0; i < St2.st_size; i ++) File1[i] = File1[i] ^ File2[i]; break; default: perror("Unknown binary operator"); exit(5); } //====================== munmap(File1, St1.st_size); munmap(File2, St2.st_size); close(FP1); close(FP2); //Renaming the changed file and make output char Buffer[1024]; if (St1.st_size <= St2.st_size) { Rn = system(strcat(strcat(strcat(strcat(strcpy(Buffer, "mv \""), argv[2]), "\" \""), argv[2]),"-Mapped\"")); if (Rn == -1) { perror("Unable to rename the new file."); exit(6); } else printf("%s is mapped.\n", argv[2]); } else { Rn = system(strcat(strcat(strcat(strcat(strcpy(Buffer, "mv \""), argv[1]), "\" \""), argv[1]),"-Mapped\"")); if (Rn == -1) { perror("Unable to rename the new file."); exit(6); } else printf("%s is mapped.\n", argv[1]); } //====================== return 0; } 
+2
source share

All Articles