chatgpt/pastedb/solomon/solomon-test.py

64 lines
2.2 KiB
Python
Raw Permalink Normal View History

import os
import argparse
from math import ceil
from pydantic import BaseModel
from typing import List
from reedsolo import RSCodec
class Args(BaseModel):
file_path: str
n: int
def parse_arguments():
parser = argparse.ArgumentParser(description='Split file into multiple pieces using Reed-Solomon coding.')
parser.add_argument('file_path', type=str, help='Path to the input file.')
parser.add_argument('n', type=int, help='Number of pieces to split the file into.')
return Args(**vars(parser.parse_args()))
def split_file_into_pieces(file_path: str, n: int):
# Load the file into memory
with open(file_path, 'rb') as f:
file_data = f.read()
# Calculate the size of each piece
piece_size = ceil(len(file_data) / n)
# Create the folders for the pieces
folder_names = [f'piece_{i+1}' for i in range(n)]
for folder_name in folder_names:
os.makedirs(folder_name, exist_ok=True)
# Encode each piece using Reed-Solomon coding and write it to the corresponding folder
codec = RSCodec(n)
for i, folder_name in enumerate(folder_names):
piece_data = file_data[i*piece_size:(i+1)*piece_size]
encoded_data = codec.encode(piece_data)
with open(os.path.join(folder_name, f'{i+1}.dat'), 'wb') as f:
f.write(encoded_data)
def reassemble_file(folder_names: List[str], output_file_path: str):
# Load the encoded pieces into memory
encoded_pieces = []
for i, folder_name in enumerate(folder_names):
with open(os.path.join(folder_name, f'{i+1}.dat'), 'rb') as f:
encoded_piece_data = f.read()
encoded_pieces.append(encoded_piece_data)
# Decode the pieces using Reed-Solomon coding
codec = RSCodec(len(encoded_pieces))
decoded_pieces = codec.decode(encoded_pieces)
# Concatenate the decoded pieces into the original file data
file_data = b''.join(decoded_pieces)
# Write the original file data to disk
with open(output_file_path, 'wb') as f:
f.write(file_data)
if __name__ == '__main__':
args = parse_arguments()
split_file_into_pieces(args.file_path, args.n)
folder_names = [f'piece_{i+1}' for i in range(args.n)]
reassemble_file(folder_names, 'reconstructed_file.png')