【问题标题】:Reading a specific sector from a hard drive using C on Linux (GNU/Linux )在 Linux (GNU/Linux) 上使用 C 从硬盘读取特定扇区
【发布时间】:2017-03-28 20:39:56
【问题描述】:

我知道硬盘是系统的文件 (/dev/sdXX)——然后被当作文件处理——我对此有疑问:

  1. 我尝试了以下几行代码,但没有任何积极意义

-------第一次尝试----------

int numSecteur=2;
char secteur [512];
FILE* disqueF=fopen("/dev/sda","r"); //tried "rb" and sda1 ...every thing
fseek(disqueF, numSecteur*512,SEEK_SET);
fread(secteur, 512, 1, disqueF);
fclose(disqueF);

-------第二次尝试----------

    int i=open("/dev/sda1",O_RDONLY);
    lseek(i, 0, SEEK_SET);
    read(i,secteur,512);
    close(i);

------打印结果----------

printf("hex : %04x\n",secteur);
printf("string : %s\n",secteur);
  1. 为什么文件 /dev/sda1 的大小只有 8 KB?

  1. 如何存储数据(二进制或十六进制……)“用于打印”

拜托,我需要一些线索,如果有人需要更多细节,他可以问。

非常感谢。

Ps:在 VMware 上运行 kali 2 64 位“debian”,我是 RooT。

【问题讨论】:

  • 没有任何作用? printf("hex : %04x\n",secteur); 是传递指向unsigned int 的指针的未定义行为。然后printf("string : %s\n",secteur); 只会从一个以 nul 结尾的可打印字符数组产生有意义的输出。最后,您的代码没有任何通常在 I/O 函数上执行的基本错误检查。
  • “数据的存储方式(二进制或十六进制……)” -- 磁性粒子只有两种状态或方向。

标签: c linux


【解决方案1】:
  1. 我尝试了以下几行代码,但没有任何积极意义

这不是问题。

  1. 为什么文件 /dev/sda1 的大小只有 8 KB?

这不是文件大小,而是设备编号。 (有两部分,所以sda1的设备号是8,1)

  1. 如何存储数据(二进制或十六进制……)“用于打印”

数据不是“为打印而存储的”。数据被存储(以表示二进制的电压,但你不需要知道),你可以用任何你想要的方式打印它。

【讨论】:

  • “数据存储(以电压表示二进制” -- HDD 将数据存储在磁域中,磁通量用于生成二进制值。您需要电池将电能存储为“电压”。
  • @sawdust DRAM 使用电容器。我假设“用于打印”是指从磁盘读取它的点和打印它的点之间,当它在 RAM 中时。 (SRAM 也使用电压,但不使用电容器)
【解决方案2】:

你不能像这样 printf() 聊天数组,你需要正确的打印结果。例如作为十六进制转储:

for (int i = 0; i < sizeof(secteur); i++) {
    printf ("%02x ", secteur[i]);
    if ((i + 1) % 16 == 0)
        printf ("\n");
}   

【讨论】:

  • plz,还有两个问题:1)为什么当我使用strlen(secteur)时它不返回512? 2)为什么当我打印 sda 的内容时是这样的(当我在 sda1 上尝试时这是正常的..)? !pct "like this".
  • 1.不,strlen() 用于字符串。在 C 字符串中,最后是 0(零)的数组。假设 char str[] = "abc";char str[] = {'a','b','c',0}; strlen() 函数相同,只需搜索数组中的第一个 0,然后返回索引 + 1。
  • 2.试试printf ("%02ux ", secteur[i]);。在 printf 格式字符串 '%02ux' 中。 '02' 表示'零填充到 2 位'(如果你打印 '5' 它将输出 '05')。 “你”的意思是“未签名”。 “x”表示“数字的十六进制表示”
  • for 2) 仍然是同样的问题,只是 sda (sda1 和 sda5 是正常的...),printf ("%02ux ", secteur[i]) 它给了我一个额外的 x每两位数字的结尾。
  • 感谢@komar 先生,解决了unsigned char secteur [512];
猜你喜欢
  • 2011-11-09
  • 2015-05-26
  • 2013-07-15
  • 1970-01-01
  • 2020-06-12
  • 2015-02-05
  • 1970-01-01
  • 2020-10-11
  • 2015-07-18
相关资源
最近更新 更多