使用Linux上的C(GNU / Linux)从硬盘驱动器读取特定扇区

时间:2017-03-28 20:39:57

标签: c linux

我知道硬盘驱动器是系统的文件 / dev / sdXX ) - 然后像文件一样对待 - 我对此有疑问:< / p>

  1. 我尝试了以下几行代码,但没有任何正面的内容
  2. -------第一次尝试----------

    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?
    2. the size !!!

      1. 如何存储数据(二进制或十六进制......)&#34;用于打印&#34;
      2. 请,我需要一些线索,如果有人需要更多详细信息,他会问。

        非常感谢。

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

2 个答案:

答案 0 :(得分:1)

  
      
  1. 我尝试了以下几行代码,但没有任何正面的内容
  2.   

那不是问题。

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

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

  
      
  1. 如何存储数据(二进制或十六进制......)&#34;用于打印&#34;
  2.   

数据不存储用于打印&#34;。数据被存储(代表二进制的电压,但你不需要知道),你可以任何你想要的方式打印它。

答案 1 :(得分:1)

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

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