Жангирхан Шаку, 404 BmpParser 15690
Арсен Жуматай,304 BmpParser 15696
f1import sysf1import sys
2bmp_data = sys.stdin.buffer.read()2bmp_data = sys.stdin.buffer.read()
3if len(bmp_data) < 14:3if len(bmp_data) < 14:
4    print('Incorrect size')4    print('Incorrect size')
5    sys.exit(0)5    sys.exit(0)
6signature = bmp_data[0:2]6signature = bmp_data[0:2]
7if signature != b'BM':7if signature != b'BM':
8    print('Not a Windows BMP')8    print('Not a Windows BMP')
9    sys.exit(0)9    sys.exit(0)
10bmp_file_size = int.from_bytes(bmp_data[2:6], byteorder='little')10bmp_file_size = int.from_bytes(bmp_data[2:6], byteorder='little')
11if bmp_file_size != len(bmp_data):11if bmp_file_size != len(bmp_data):
12    print('Incorrect size')12    print('Incorrect size')
13    sys.exit(0)13    sys.exit(0)
14if len(bmp_data) < 18:14if len(bmp_data) < 18:
15    print('Incorrect size')15    print('Incorrect size')
16    sys.exit(0)16    sys.exit(0)
17dib_header_size = int.from_bytes(bmp_data[14:18], byteorder='little')17dib_header_size = int.from_bytes(bmp_data[14:18], byteorder='little')
18if dib_header_size not in [12, 16, 40, 52, 56, 64, 108, 124]:18if dib_header_size not in [12, 16, 40, 52, 56, 64, 108, 124]:
19    print('Incorrect header size')19    print('Incorrect header size')
20    sys.exit(0)20    sys.exit(0)
21offset = 1421offset = 14
22if len(bmp_data) < offset + dib_header_size:22if len(bmp_data) < offset + dib_header_size:
23    print('Incorrect size')23    print('Incorrect size')
24    sys.exit(0)24    sys.exit(0)
25if dib_header_size == 12:25if dib_header_size == 12:
26    if len(bmp_data) < offset + 12:26    if len(bmp_data) < offset + 12:
27        print('Incorrect size')27        print('Incorrect size')
28        sys.exit(0)28        sys.exit(0)
29    width = int.from_bytes(bmp_data[offset + 4:offset + 6], byteorder='l29    width = int.from_bytes(bmp_data[offset + 4:offset + 6], byteorder='l
>ittle', signed=False)>ittle', signed=False)
30    height = int.from_bytes(bmp_data[offset + 6:offset + 8], byteorder='30    height = int.from_bytes(bmp_data[offset + 6:offset + 8], byteorder='
>little', signed=False)>little', signed=False)
31    bits_per_pixel = int.from_bytes(bmp_data[offset + 10:offset + 12], b31    bits_per_pixel = int.from_bytes(bmp_data[offset + 10:offset + 12], b
>yteorder='little', signed=False)>yteorder='little', signed=False)
32    compression_method = 032    compression_method = 0
33    image_size = 033    image_size = 0
34elif dib_header_size == 16:34elif dib_header_size == 16:
35    if len(bmp_data) < offset + 16:35    if len(bmp_data) < offset + 16:
36        print('Incorrect size')36        print('Incorrect size')
37        sys.exit(0)37        sys.exit(0)
38    width = int.from_bytes(bmp_data[offset + 4:offset + 6], byteorder='l38    width = int.from_bytes(bmp_data[offset + 4:offset + 6], byteorder='l
>ittle', signed=True)>ittle', signed=True)
39    height = int.from_bytes(bmp_data[offset + 6:offset + 8], byteorder='39    height = int.from_bytes(bmp_data[offset + 6:offset + 8], byteorder='
>little', signed=True)>little', signed=True)
40    bits_per_pixel = int.from_bytes(bmp_data[offset + 10:offset + 12], b40    bits_per_pixel = int.from_bytes(bmp_data[offset + 10:offset + 12], b
>yteorder='little', signed=False)>yteorder='little', signed=False)
41    compression_method = int.from_bytes(bmp_data[offset + 12:offset + 1641    compression_method = int.from_bytes(bmp_data[offset + 12:offset + 16
>], byteorder='little')>], byteorder='little')
42    image_size = 042    image_size = 0
43else:43else:
44    if len(bmp_data) < offset + 24:44    if len(bmp_data) < offset + 24:
45        print('Incorrect size')45        print('Incorrect size')
46        sys.exit(0)46        sys.exit(0)
47    width = int.from_bytes(bmp_data[offset + 4:offset + 8], byteorder='l47    width = int.from_bytes(bmp_data[offset + 4:offset + 8], byteorder='l
>ittle', signed=True)>ittle', signed=True)
48    height = int.from_bytes(bmp_data[offset + 8:offset + 12], byteorder=48    height = int.from_bytes(bmp_data[offset + 8:offset + 12], byteorder=
>'little', signed=True)>'little', signed=True)
49    bits_per_pixel = int.from_bytes(bmp_data[offset + 14:offset + 16], b49    bits_per_pixel = int.from_bytes(bmp_data[offset + 14:offset + 16], b
>yteorder='little', signed=False)>yteorder='little', signed=False)
50    compression_method = int.from_bytes(bmp_data[offset + 16:offset + 2050    compression_method = int.from_bytes(bmp_data[offset + 16:offset + 20
>], byteorder='little')>], byteorder='little')
51    image_size = int.from_bytes(bmp_data[offset + 20:offset + 24], byteo51    image_size = int.from_bytes(bmp_data[offset + 20:offset + 24], byteo
>rder='little')>rder='little')
52width_abs = abs(width)52width_abs = abs(width)
53height_abs = abs(height)53height_abs = abs(height)
54bits_per_row = width_abs * bits_per_pixel54bits_per_row = width_abs * bits_per_pixel
55bytes_per_row = (bits_per_row + 7) // 855bytes_per_row = (bits_per_row + 7) // 8
56padding = (4 - bytes_per_row % 4) % 456padding = (4 - bytes_per_row % 4) % 4
57bytes_per_row_padded = bytes_per_row + padding57bytes_per_row_padded = bytes_per_row + padding
58calculated_image_size = bytes_per_row_padded * height_abs58calculated_image_size = bytes_per_row_padded * height_abs
59if image_size == calculated_image_size + 2:59if image_size == calculated_image_size + 2:
60    placeholder_size = 260    placeholder_size = 2
61elif image_size == calculated_image_size or image_size == 0:61elif image_size == calculated_image_size or image_size == 0:
62    placeholder_size = 062    placeholder_size = 0
t63elif image_size == calculated_image_size + 2:t
64    placeholder_size = 2
65else:63else:
66    print('Incorrect image size')64    print('Incorrect image size')
67    sys.exit(0)65    sys.exit(0)
68print(f'{width_abs} {height_abs} {bits_per_pixel} {compression_method} {66print(f'{width_abs} {height_abs} {bits_per_pixel} {compression_method} {
>placeholder_size}')>placeholder_size}')
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op