File size: 2,694 Bytes
494c89b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
"""
CBOR encoding/decoding utilities.

CBOR (Compact Binary Object Representation) - бинарный формат данных,
используемый AWS Smithy RPC v2 protocol.
"""

import cbor2
from typing import Any, Dict, Union


def cbor_encode(data: Union[Dict[str, Any], list]) -> bytes:
    """
    Кодирует Python dict/list в CBOR bytes.
    
    Args:
        data: Словарь или список для кодирования
        
    Returns:
        CBOR encoded bytes
        
    Raises:
        ValueError: Если кодирование не удалось
        
    Example:
        >>> cbor_encode({'name': 'John', 'age': 30})
        b'\\xa2dnamedjohncage\\x18\\x1e'
    """
    try:
        return cbor2.dumps(data)
    except Exception as e:
        raise ValueError(f"CBOR encode failed: {e}")


def cbor_decode(data: bytes) -> Union[Dict[str, Any], list]:
    """
    Декодирует CBOR bytes в Python dict/list.
    
    Args:
        data: CBOR encoded bytes
        
    Returns:
        Декодированный словарь или список
        
    Raises:
        ValueError: Если декодирование не удалось
        
    Example:
        >>> cbor_decode(b'\\xa2dnamedjohncage\\x18\\x1e')
        {'name': 'John', 'age': 30}
    """
    try:
        return cbor2.loads(data)
    except Exception as e:
        raise ValueError(f"CBOR decode failed: {e}")


def cbor_encode_hex(data: Union[Dict[str, Any], list]) -> str:
    """
    Кодирует в CBOR и возвращает hex представление для отладки.
    
    Args:
        data: Данные для кодирования
        
    Returns:
        Hex строка (например, "a2 64 6e 61 6d 65 64 4a 6f 68 6e")
        
    Example:
        >>> cbor_encode_hex({'name': 'John'})
        'a2 64 6e 61 6d 65 64 4a 6f 68 6e'
    """
    encoded = cbor_encode(data)
    return ' '.join(f'{b:02x}' for b in encoded)


def cbor_size_comparison(data: Union[Dict[str, Any], list]) -> Dict[str, int]:
    """
    Сравнивает размер JSON vs CBOR для отладки.
    
    Args:
        data: Данные для сравнения
        
    Returns:
        {'json': int, 'cbor': int, 'savings': int}
        
    Example:
        >>> cbor_size_comparison({'name': 'John', 'age': 30})
        {'json': 26, 'cbor': 17, 'savings': 9}
    """
    import json
    
    json_bytes = json.dumps(data).encode()
    cbor_bytes = cbor_encode(data)
    
    return {
        'json': len(json_bytes),
        'cbor': len(cbor_bytes),
        'savings': len(json_bytes) - len(cbor_bytes)
    }