CBOR ist ein Binärformat, welches beliebig verschachtelte Daten abbilden kann.
Das Prinzip ist im Grunde das gleiche wie bei JSON.
Auch dort kann man direkt seine Variablen aus dem Programm nehmen und in dieses Format konvertieren.
Auf die Art kann man seine Daten außerhalb des Programmes speichern oder mit anderen Programmen austauschen, was umso einfacher ist, da so gut wie alle Programmiersprachen den JSON-Standard verstehen.
Auch bei CBOR ist das ähnlich, nur mit dem Unterschied, dass CBOR eben kein textbasiertes Format ist, sondern ein Binärformat.
Das macht es natürlich unmöglich für einen Menschen es direkt zu lesen aber andererseits sind die Ergebnisse in der Regel kleiner als in JSON.
Nun wie arbeitet man damit? - hier ein Beispiel:
#include "CBOR.au3"
; verschachtelte AutoIt-Struktur erzeugen
Global $aArray = [1, 2.0, 3.3]
Global $vValue[] ; leere Map
$vValue["Test"] = $aArray
$vValue[123] = "String"
; AutoIt-Variablen in CBOR-Format binär serialisieren:
$bCBOR = _cbor_encode($vValue)
ConsoleWrite(StringFormat("% 20s: % 8d bytes\n", "serialisierte Größe", BinaryLen($bCBOR)))
; Rückkonvertierung in AutoIt-Variable aus CBOR-Binary:
$vAutoIt = _cbor_decode($bCBOR)
; Testen ob Struktur noch passt:
ConsoleWrite($vAutoIt.Test[2] & @CRLF)
Alles anzeigen
In diesem Fall belegt unsere AutoIt-Datenstruktur am Ende noch 29 Bytes an Platz.
Da der Vergleich zu JSON naheliegt - hier noch ein Beispiel (die JSON-UDF wird noch benötigt) um zu schauen wie beide interagieren:
Spoiler anzeigen
#include "CBOR.au3"
#include "JSON.au3"
; Daten im JSON-format
Global $sString = '[{"id":"4434156","url":"https://legacy.sky.com/v2/schedules/4434156","title":"468_CORE_1_R.4 Schedule","time_zone":"London","start_at":"2017/08/10 19:00:00 +0100","end_at":null,"notify_user":false,"delete_at_end":false,"executions":[],"recurring_days":[],"actions":[{"type":"run","offset":0}],"next_action_name":"run","next_action_time":"2017/08/10 14:00:00 -0400","user":{"id":"9604","url":"https://legacy.sky.com/v2/users/9604","login_name":"robin@ltree.com","first_name":"Robin","last_name":"John","email":"robin@ltree.com","role":"admin","deleted":false},"region":"EMEA","can_edit":true,"vm_ids":null,"configuration_id":"19019196","configuration_url":"https://legacy.sky.com/v2/configurations/19019196","configuration_name":"468_CORE_1_R.4"},{"id":"4444568","url":"https://legacy.sky.com/v2/schedules/4444568","title":"468_CORE_1_R.4 Schedule","time_zone":"London","start_at":"2017/08/11 12:00:00 +0100","end_at":null,"notify_user":false,"delete_at_end":false,"executions":[],"recurring_days":[],"actions":[{"type":"suspend","offset":0}],"next_action_name":"suspend","next_action_time":"2017/08/11 07:00:00 -0400","user":{"id":"9604","url":"https://legacy.sky.com/v2/users/9604","login_name":"robin@ltree.com","first_name":"Robin","last_name":"John","email":"robin@ltree.com","role":"admin","deleted":false},"region":"EMEA","can_edit":true,"vm_ids":null,"configuration_id":"19019196","configuration_url":"https://legacy.sky.com/v2/configurations/19019196","configuration_name":"468_CORE_1_R.4"}]'
ConsoleWrite(StringFormat("% 20s: % 8d bytes\n", "Größe JSON-String", BinaryLen(StringToBinary($sString, 4))))
; konvertiere in CBOR-Binärdatenformat:
Global $bCBOR = _JsonToCbor($sString)
ConsoleWrite(StringFormat("% 20s: % 8d bytes\n", "Größe CBOR-binary", BinaryLen($bCBOR)))
; wandele in JSON-String zurück um zu schauen ob Hin-und-her Konvertierung korrekt war:
Global $sRecovered = _CborToJson($bCBOR)
ConsoleWrite($sRecovered & @CRLF)
Func _JsonToCbor($sJSONString)
Local $vData = _JSON_Parse($sString)
Return _cbor_encode($vData)
EndFunc
Func _CborToJson($bCBOR)
Local $vDecoded = _cbor_decode($bCBOR)
Return _JSON_Generate($vDecoded)
EndFunc
Alles anzeigen
>>Download und Quellcode auf GitHub<<
Changelog:
2023/02/08 |
|