Spaces:
Sleeping
Sleeping
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)
}
|