Лучший способ создать C как структуру в Python - PullRequest
0 голосов
/ 23 октября 2019

Прежде всего, я только начал python, но я очень старался найти то, что подходит для меня. Я собираюсь сделать простую файловую систему для Linux, но, честно говоря, я даже не уверен, достижимо ли это с помощью Python. Поэтому мне нужно немного помочь здесь.

Я попытался создать структуру классов и назвал кортежи (по одному, которые подходят), и я решил, что классы будут лучше для меня. Дело в том, что я не мог читать побайтово, потому что размер моего класса был 888, а в C - 44 (там я использовал sys.getsizeof ()). Будет лучше понять, чего я хочу достичь с помощью кода ниже

Для этой структуры

struct sb{
    int inode_bitmap;
    int data_bitmap[10];
};

Я использовал

#SUPER BLOCK
class sb(object):
    __slots__ = ['inode_bitmap', 'data_bitmap'] #REDUCE RAM USAGE
    def __init__(bruh, inode_bitmap, data_bitmap):
        bruh.inode_bitmap = inode_bitmap
        bruh.data_bitmap = [None] * 10 #DEFINITION OF ARRAY

Все было хорошо, пока я не прочитал это

    FILE * fin = fopen("simplefs.bin", "r");
        struct inode slash;

    fseek(fin, sizeof(struct sb), SEEK_SET);
    fread(&slash,sizeof(slash),1,fin);
fin = open("simplefs.bin", "rb")


slash = inode

print("pos:", fin.tell())
contents = fin.read(sys.getsizeof(sb))
print(contents)

С момента фактическогоразмер файла был примерно 4800, но когда я читал, размер был примерно 318

Я прекрасно понимаю, что python - это не C, но я просто провожу некоторые эксперименты, если это возможно

1 Ответ

0 голосов
/ 23 октября 2019

Вы не можете спроектировать структуру, а затем попытаться прочитать / записать ее в файл и ожидать, что она будет двоичной идентичной. Если вы хотите проанализировать любые двоичные данные, у вас есть модуль struct, который позволяет интерпретировать прочитанные вами данные как int, float и дюжину других форматов. Тем не менее, вы должны написать форматы вручную. В вашем конкретном случае:

import struct

with ('datafile.dat') as fin :
    raw_data = fin.read()

data = struct.unpack_from( '11I', raw_data )  # 11 integers
inode_bitmap = data[0]
data_bitmap = data[1:]

Или что-то похожее ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...