【问题标题】:Changing BIT XXX on hard drive from 0 to 1将硬盘上的 BIT XXX 从 0 更改为 1
【发布时间】:2017-07-13 06:32:56
【问题描述】:

我正在做一个项目来自己创建一个加密。 我知道这不安全,我只是想为自己和出于测试原因使用它

对于算法的基础知识,我需要将我的 HDD 上的 BIT 编号 XY 从 0 更改为 1。 问题是我真的不知道该怎么做。我将为这个项目使用一个从未有过数据的全新驱动器。

假设这个驱动器有 250GB 大,我想将这个驱动器上的第一个 BIT 从 0 更改为 1,我需要怎么做? 我是否需要创建一个只有 0 的大文件,或者我可以直接告诉驱动器上的写入部分它需要转到位置 XY 并将该位置的 BIT 从 0 更改为 1?

我想在这个项目中使用 C++ 来存档最大速度。

感谢您的建议。

【问题讨论】:

  • 什么操作系统?

标签: c++ encryption storage


【解决方案1】:

在 Linux 上,使用 root 运行时,您可以将整个驱动器作为一个文件进行寻址。像下面这样切换分区的第一位。

int f = -1;
unsigned char data = 0;

f = open("/dev/hdb1", O_RDWR);
read(f, &data, 1);
data = data ^ 0x80;
lseek(f, SEEK_SET, 0);
write(f, &data, 1);
close(f);

/dev/hdb1 可能是第二个驱动器上的第一个分区。您可能还可以为整个驱动器本身寻址 /dev/hdb

【讨论】:

  • dosen't data = data ^ 0x80; 把它变成一个完整的字节?如果我将其写入第 1 位,然后在第 2 位上执行相同操作,我会覆盖第 1 位吗?
  • data = data ^ x80 切换data 中的第一个(高位)位,其他 7 位保持不变。
【解决方案2】:

好的,我决定创建一个仅包含 null 字节的文件。 如果我想更改单个 BIT,我将使用以下计算:

int bit = XXX; //BIT that will be adjusted
double byte = bit / 8; //Byte that contains BIT
Byte b = getByte( (int)byte ); //save the Byte
b = adjustByte( b, (int)((byte - bit)*8), VALUE ); //adjust the Byte with ASCII symbol
saveByteToFile( b, byte ); //save the Byte back to File to old position

这只是伪代码。 如果有人有更好的想法如何解决这个问题,请告诉我。

【讨论】:

  • 不要使用double 类型的变量来计算文件中的字节偏移量。 bit/8 无论如何都是一个整数表达式。坚持整数。你的字节偏移量是bit/8,因为你有它。但是您在该字节内的位偏移量很容易计算为bit % 8(byte - bit)*8 表达毫无意义。我怀疑你需要更多地了解 C 中的整数类型和按位算术才能有效地做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 2019-10-28
  • 1970-01-01
相关资源
最近更新 更多