Převod uint64 to byte[]

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
Dokola
Příspěvky: 2
Registrován: 04 úno 2018, 20:57

Převod uint64 to byte[]

Příspěvek od Dokola » 05 úno 2018, 23:03

Hledám způsob jak převést číslo ve formátu uint64 např. 0xffffffe7e7ffffff na pole
byte zdrojPic [] = { B11111111, B11111111, B11111111,......


Matematicky to umím, ale v Arduinu teprve tápu a tak to dělám asi strašně složitě a zamotávám se do toho.
Nasměruje mne někdo prosím správným směrem?

Uživatelský avatar
pavel1tu
Příspěvky: 2065
Registrován: 26 říj 2017, 08:28
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Převod uint64 to byte[]

Příspěvek od pavel1tu » 06 úno 2018, 06:40

Ve specifikaci jsem nenašel že by to přímo "jazyk" uměl.

Asi přes pole ?

char mujarray[8][15]=
{
"00000000",
"00000001",
"00000010",
"00000011"

atd..
};

pochopil ?
pak vyhledáš znak a nahradíš ho částí z řetězce
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Kontaktovat uživatele:

Re: Převod uint64 to byte[]

Příspěvek od petan » 06 úno 2018, 06:49

Nešlo by to takto? (nezkoušel jsem)

Kód: Vybrat vše

for (byte i=7; i>=0; i--){
 zdrojPic[i] = puvodniCislo; 
 puvodniCislo >>= 8;  
}

zbysek
Site Admin
Příspěvky: 125
Registrován: 22 úno 2017, 15:18

Re: Převod uint64 to byte[]

Příspěvek od zbysek » 06 úno 2018, 08:23

Pokud je cílem získat jednotlivé byty z čísla typu uint64, mohlo by fungovat něco takového:

Kód: Vybrat vše

uint64_t x = 0xffffffe7e7ffffff;
for(int i = 0; i < 8; i++) {
    byte b = ((uint8_t *)&x)[i]); //byte na poloze i
    // ...
}
((uint8_t *)&x))
funguje tak, že vezme adresu proměnné x: (&x)
máme tedy ukazatel někam do paměti. Ten dále přetypujeme na ukazatel na byte/uint8_t: ((uint8_t *)&x)
proměnná datového typu pole se chová podobně, jako ukazatel a naopak, můžeme tedy přistupovat k jednotlivým prvkům pomocí indexu: ((uint8_t *)&x)

Záleží co potřebujete s jednotlivými byty dělat.
Pokud chcete získat hodnoty binárně, můžete si je posílat po sériové lince:

Kód: Vybrat vše

Serial.print(b, BIN) 
petanovo řešení by také mohlo fungovat

Uživatelský avatar
pavel1tu
Příspěvky: 2065
Registrován: 26 říj 2017, 08:28
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Převod uint64 to byte[]

Příspěvek od pavel1tu » 06 úno 2018, 15:28

zbysek píše:
06 úno 2018, 08:23
Pokud je cílem získat jednotlivé byty z čísla typu uint64, mohlo by fungovat něco takového:

Kód: Vybrat vše

uint64_t x = 0xffffffe7e7ffffff;
for(int i = 0; i < 8; i++) {
    byte b = ((uint8_t *)&x)[i]); //byte na poloze i
    // ...
}
((uint8_t *)&x))
funguje tak, že vezme adresu proměnné x: (&x)
máme tedy ukazatel někam do paměti. Ten dále přetypujeme na ukazatel na byte/uint8_t: ((uint8_t *)&x)
proměnná datového typu pole se chová podobně, jako ukazatel a naopak, můžeme tedy přistupovat k jednotlivým prvkům pomocí indexu: ((uint8_t *)&x)

Záleží co potřebujete s jednotlivými byty dělat.
Pokud chcete získat hodnoty binárně, můžete si je posílat po sériové lince:

Kód: Vybrat vše

Serial.print(b, BIN) 
petanovo řešení by také mohlo fungovat
To je SUPER, hned to jdu vyzkoušet .... i když nevím zda to někdy bude potřeba.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 7 hostů