LSB数据头类,用于存储嵌入数据的元信息
| 7 | |
| 8 | |
| 9 | class LSBDataHeader: |
| 10 | """LSB数据头类,用于存储嵌入数据的元信息""" |
| 11 | |
| 12 | # 数据头标记(9字节) |
| 13 | DATA_STAMP = b"STEGAPY " # 9字节,StegaPy项目标记 |
| 14 | HEADER_VERSION = b'\x02' # 1字节,版本2 |
| 15 | FIXED_HEADER_LENGTH = 8 # 固定头长度 |
| 16 | CRYPT_ALGO_LENGTH = 8 # 加密算法名称长度 |
| 17 | MAX_FILENAME_LENGTH = 255 # 最大文件名长度 |
| 18 | |
| 19 | def __init__(self, data_length=0, channel_bits_used=1, filename=None, config=None): |
| 20 | """初始化数据头 |
| 21 | |
| 22 | Args: |
| 23 | data_length: 数据长度(不包括头) |
| 24 | channel_bits_used: 每个颜色通道使用的位数 |
| 25 | filename: 文件名 |
| 26 | config: StegaPyConfig配置对象 |
| 27 | """ |
| 28 | self.data_length = data_length |
| 29 | self.channel_bits_used = channel_bits_used |
| 30 | self.filename = filename or "" |
| 31 | self.config = config |
| 32 | |
| 33 | if len(self.filename.encode('utf-8')) > self.MAX_FILENAME_LENGTH: |
| 34 | raise ValueError(f"文件名编码后长度不能超过{self.MAX_FILENAME_LENGTH}字节") |
| 35 | |
| 36 | def get_data_length(self): |
| 37 | """获取数据长度""" |
| 38 | return self.data_length |
| 39 | |
| 40 | def get_filename(self): |
| 41 | """获取文件名""" |
| 42 | return self.filename |
| 43 | |
| 44 | def get_channel_bits_used(self): |
| 45 | """获取每个通道使用的位数""" |
| 46 | return self.channel_bits_used |
| 47 | |
| 48 | def to_bytes(self): |
| 49 | """转换为字节数组""" |
| 50 | filename_bytes = self.filename.encode('utf-8') |
| 51 | filename_len = len(filename_bytes) |
| 52 | |
| 53 | if filename_len > self.MAX_FILENAME_LENGTH: |
| 54 | raise ValueError(f"文件名编码后长度超过{self.MAX_FILENAME_LENGTH}字节") |
| 55 | |
| 56 | # 构建头数据 |
| 57 | header = bytearray() |
| 58 | |
| 59 | # 1. DATA_STAMP (9字节) |
| 60 | header.extend(self.DATA_STAMP) |
| 61 | |
| 62 | # 2. HEADER_VERSION (1字节) |
| 63 | header.extend(self.HEADER_VERSION) |
| 64 | |
| 65 | # 3. FIXED_HEADER (8字节) |
| 66 | # dataLength (4字节,小端序) |
no outgoing calls
no test coverage detected