Stránka 1 z 2
Json jak nacpat uint8_t data
Napsal: 12 led 2024, 10:25
od Dumitru
Ahojte je možnosť uložiť pole typu
do Json,
najprv som si myslel že to bude možne uložiť ako Json string
a ďalej si dáta z databázy vytiahnem a budem pracovať s nimi ako s uint8_t
Problém je ak napríklad uint8_t hodnota sa bude rovnať jeden z príkladov medzere to mi potom db vyhodí ako error, niečo ako not valid json format
Je mi jasne že to budem môcť do db dostať ako iný formát
https://mariadb.com/kb/en/data-types/Json je ale z hľadiska parsingu vhodný nakoľko to vie rovno DB a ja si len vypýtam dáta pre S1 a dostanem len ich z celého stringu takže ak by bola nejaká možnosť tie dáta tam narvať budem len rad
Napadlo mi jedno riešenie cele pole previesť ako hex to char
teda priklad:
bude reprezentovane ako char[4] kde
Kód: Vybrat vše
char[0] = '0';
char[1] = 'x';
char[2] = '1';
char[3] = '2';
cele to spáchať až po
a následne to cele poslať ako Json string
ale ak existuje niečo vhodnejšie budem rad každej informácie
Napsal: 12 led 2024, 12:05
od pocitujlasku
ako moze uint8_t obsahovat medzeru? ved to su cisla v rozsahu 0..255 nic ine.
array sa v json zapisuje ako
Myslim, ze tu je problem uz v samotnom navrhu
a bacha, json v db je strasne pomaly, ak chces nieco v nom vyhladavat.
Napsal: 12 led 2024, 12:38
od Dumitru
môže, keď to mcu pošle cez http rovno surové dáta, tvoj zápis bude fungovať ak v mcu si prekonvertuje uint8 to char a potom to pošle v takom formáte ako si napisal ale hodnoty 1 2 3 4 budu reprezentovane ich asci hodnotou
Asi to neviem dobre vysvetliť

ale mame v mcu uložene v
Kód: Vybrat vše
uint8_t data[] = { 0x01,0x02,0x03,0x04};
vytvoríme
Kód: Vybrat vše
char json[] = { '"', 'S1' , '"', ':', '[', data[0] , ',' , data[1] , ',' , data[2]
, ',' , data[3] , ']' };
'
následne toto cele ak pošlem cez HTTP tak to nebude fungovať
Odstraněna citace předcházejícího příspěvku, viz bod 4f "Pravidel". jimirek
Napsal: 12 led 2024, 13:32
od pocitujlasku
tak lebo to robis zle. bud tam posielas ciselne hodnoty [1,2,3] alebo mu tam posielas rovno ascii znaky, ale vtedy ich musis dat do uvodzoviek ['a', 'b', ' ']
ty mu tam pravdepodobne posielas ascii znaky, ale nie su v uvodzovkach, a preto to nejde.
Tipujem, je to arduino?
Napsal: 12 led 2024, 14:06
od Dumitru
pocitujlasku píše:ako moze uint8_t obsahovat medzeru? ved to su cisla v rozsahu 0..255 nic ine.
array sa v json zapisuje ako
Myslim, ze tu je problem uz v samotnom navrhu
a bacha, json v db je strasne pomaly, ak chces nieco v nom vyhladavat.
oukej skúsim to popísať inač
skús si uložiť toto do db

a uvidíš že to nepôjde

Napsal: 12 led 2024, 14:36
od pocitujlasku
jasne, ze to nepojde, lebo A nie je cislo. v poli musis mat rovnaky datovy typ.
a ked uz, tak by to malo byt 'A' - v uvodzovkach
Napsal: 12 led 2024, 14:38
od Valdano
Co to má vůbec být?
Za mě to vůbec nedává smysl a je to zřejmě naprosto vytržené z kontextu a od základu i špatně navržené.
Posílat v textovém protokolu HTML textové znaky odpovídající hodnotám nad 32 dekadicky v kombinaci a binárními hodnotami pod 32 dekadicky viz ty hodnoty
0x01 až
0x04, což děláte, je dle mého názoru nesmyslné a tudíž vám to pak logicky nefunguje správně, a to nemluvě o tom, že pokud se s tím obsahem v poli
json[] má zacházet jako s textovým řetězcem tak vám na konci chybí zakončení 0, ale i tak se mi to zdá od základu špatně navržené.
Kód: Vybrat vše
uint8_t data[] = { 0x01,0x02,0x03,0x04};
char json[] = { 34, 'S', '1' , 34, ':', '[', data[0] , ',' , data[1] , ',' , data[2] , ',' , data[3] , ']', 0 };
A tohle je obsah json[]:
"S1":[☺,☻,♥,♦]
tedy v podstatě nesmyslná kombinace zobrazitelných (nad 32 dekadicky) a nezobrazitelných (pod 32 dekadicky) znaků char, které jsou intepretovány takto, ale na straně nějaké DB kde se to snažíte zapisovat do položky nějakého typu to může být logicky odmítnuto jako nepovolená hodnota.
Mimochodem je jedno jestli na konkrétní pozici pole napíšete v jazyce C hodnotu
dekadicky jako číslo nebo
hexa nebo
znakově, protože v jazyce C, ve kterém s tím defacto pracujete je to významově totéž a výsledek je ten obsah pole json[]. Podstatné je, že každá pozice pole je v reálu jen jeden char.
Dekadicky např.
34 je totéž co hexa
0x22 a totéž co jeden char zapsaný v jednoduchých uvozovkách
'"'.
Napsal: 12 led 2024, 15:10
od Dumitru
Áno konečne niekto mi rozumie
Všetko čo ste popísali je úplne správne , lenže mne to zobrazovať ako ascii netreba ja viem že to čo tam pošlem je z hľadiska ascii úplná blbosť a viem že ďalej z dátami z db ktoré spracujem nejakou mnou apkou musím pracovať ako s dekadickými hexa binarnymi ... hodnotami.
Totižto ja chcem do JSON dostať pole ktoré bude obsahovať akekolvek hodnoty od 0...255. Tak aby ma db neblokovala že používam nepovolene znaky. Pretože db sa na nich pozerá ako na ascii znaky
pocitujlasku píše:jasne, že to nepôjde, lebo A nie je číslo. v poli musis mat rovnaký dátový typ.
a keď už, tak by to malo byt 'A' - v úvodzovkách
Pre teba je to A nie je číslo ale pre mňa je to dekadické číslo 65

a jasne že tam musíš dať úvodzovky ale stále to bude len 65
Odstraněna citace předcházejícího příspěvku, viz bod 4f "Pravidel". jimirek
Napsal: 12 led 2024, 15:25
od Valdano
Problémem je ovšem právě v tom přenosu binárních dat přes textový HTML protokol. Předpokládám, že ten HTML poskytuje nějaká serverová aplikace, kterou si jste sám napsal.
Je otázkou co přesně znak po znaku přijme druhá strana a jak to ta druhá strana v reálu vidí či jak to interpretuje, a to ještě před tím než to bude předávat do jakéhokoli DB?
Problém je totiž možná v tom, že při přenosu vhodně nezakódovaných binárních dat přes textový protokol HMTL dojde k jejich zkomolení a druhá strana pak obdrží bůhví co. Při posílání binárních dat přes HTML je vhodnější použít textové kódování BASE64 podobně jako třeba v emailech.
Takže je na zvážení možnost ty binární data na straně serverové aplikace nejprve převést do jednoto textového řetězce BASE64 což je čistě textové kódování používající jen zobrazitelné znaky omezené jen na část ASCII sady a protistraně je pak předat přes HTML jako BASE64 řetězec neobsahující žádná binární data. Protistrana si pak přijatý řetězec BASE64 převede zpět na původní binární data aniž by došlo k jejich zkomolení.
Napsal: 12 led 2024, 15:31
od pocitujlasku
ani pre db to nie je cislo. Pozor na to, ze dnes sa uz pracuje s UTF-8 a nie ascii. preto ti stale opakujem, posielaj tam cisla, a nemiesaj ascii znaky a ich ord hodnotu.
pre teba stale moze byt A=65, ale parser, ako vidis s tym ma problem.
Ak to robis v arduine, existuje super kniznica arduinojson, kde si vies krasne serializovat a deserializovat json a vyhnes sa takymto zvlastnym rieseniam
Napsal: 12 led 2024, 15:36
od Valdano
Ano nebastlit to takto nevhodně po svém, ale použít
knihovnu ArduinoJson je dobré řešení.
Napsal: 12 led 2024, 15:52
od Dumitru
pocitujlasku píše:ani pre db to nie je cislo. Pozor na to, ze dnes sa uz pracuje s UTF-8 a nie ascii. preto ti stale opakujem, posielaj tam cisla, a nemiesaj ascii znaky a ich ord hodnotu.
pre teba stale moze byt A=65, ale parser, ako vidis s tym ma problem.
Ak to robis v arduine, existuje super kniznica arduinojson, kde si vies krasne serializovat a deserializovat json a vyhnes sa takymto zvlastnym rieseniam
Valdano píše:Ano nebastlit to takto nevhodně po svém, ale použít
knihovnu ArduinoJson je dobré řešení.
Super ďakujem vám za objasnenie a s arduino nepracujem ale pozriem sa do kodu ako je to tam implementovane .
každopádne už teraz predpokladám že v tej knižnice sa budú číselne hodnoty uint interpretovane na ich ascii hodnotu ako napríklad 0x01 -> '1' 0xff -> "255" aby HTML s tým nemal potiže

a následne sa to cele ešte zapuzdri do formátu JSON .
Ja som dneska narýchlo spravil podobne riešenie len interpretujem hex hodnotu do ascii a nasledne to zašlem
Kód: Vybrat vše
void hex_to_str ( const uint8_t* input_data, char* output_string, const uint16_t length )
{
for (uint16_t i = 0; i < length; i++)
{
*(output_string++) = '0';
*(output_string++) = 'x';
output_string += sprintf(output_string,"%.2x", *(input_data++)); // save data and increment pointer value
}
}
Napsal: 12 led 2024, 15:59
od Valdano
Převést binární data na straně serveru na čistě textový řetězec složený z hexa vyjádření jednotlivých hodnot v poli je také určitý způsob řešení. Pokud stačí do DB ukládat jen takto složené řetězce pak na straně protistrany ani nebude nutné převádět data do jiného formátu a do DB se uloží jen jako čisté řetězce obsahující textové hexa vyjádření tj. tak jak jsou převedeny.
Zdrojáky knihovny
ArduinoJson jsou na GitHubu, ale nečekal bych nic jednoduchého.

Napsal: 12 led 2024, 17:34
od samec
To je jak že neovládam malú násobilku, ale idem počítať trojný integrál.

Napsal: 12 led 2024, 19:18
od Dumitru
Valdano píše:Převést binární data na straně serveru na čistě textový řetězec složený z hexa vyjádření jednotlivých hodnot v poli je také určitý způsob řešení. Pokud stačí do DB ukládat jen takto složené řetězce pak na straně protistrany ani nebude nutné převádět data do jiného formátu a do DB se uloží jen jako čisté řetězce obsahující textové hexa vyjádření tj. tak jak jsou převedeny.
Zdrojáky knihovny
ArduinoJson jsou na GitHubu, ale nečekal bych nic jednoduchého.


jj našiel som si to ale ďakujem.
Inak len na okraj dáta tam chodili správne (to netvrdím že to tak robiť je správne) problém bol že ich tam db nechcela pustiť. Diky za pomoc
samec píše:To je jak že neovládam malú násobilku, ale idem počítať trojný integrál.

Doučím sa

nasobilku