Sziasztok!
Életemben először folyok beléje a bináris kommunikációba, és a következő a kérdésem.
A code -ot kellene binárisként továbbítanom, és az xvputlit32 fg erre nekem a megfelelő.
Példák alapján arra jöttem rá, hogy ez 3 paramétert vár (resp,offset,code)
Viszont az alábbi megoldásra aszongya nékem, hogy argument error.
Why?
Vagy van valakinek szebb és jobb megoldása erre?
code:="D300071015040000"
r:=padr(code,ceil(len(r)/4)*4,chr(0))
bekk:=space(0)
i:=1
while(i <= len(r))
bekk+=l2bin(hex2l(substr(r,i,4)))
i:=i+4
end
xvputlit32(resp:=space(len(bekk)),0,bekk)
- 6923 megtekintés
Hozzászólások
Kérdés, hogy CCC2-ben vagy 3-ban dolgozol. Ui a CCC3-ban a character és byte meg van különböztetve. És pontosabban melyik arg rossz?
- A hozzászóláshoz be kell jelentkezni
ccc2-t kell használnom, mert a rencer amire dolgozunk, egyelőre nem támogatja a 3-at sajn'
Íme az error:
default error block evaluated
errorclass: error
operation: xvputlit32
description: argument error
args:{STRING length=12 oref=b7013278 " ", NUMBER 0, STRING length=12 oref=b701326c "^�^^^^^^^^^"}
called from deferror(215)
called from _blk__2(0)
called from xvputlit32(0)
called from main(36)
- A hozzászóláshoz be kell jelentkezni
xvputlit32(char_buffer,num_offset,num_value)
Nekem úgy tünik, hogy a bekk az egy char (num helyett).
- A hozzászóláshoz be kell jelentkezni
kipróbálom legott. hex2l -t vár ez tőlem a 3. paramba?
- A hozzászóláshoz be kell jelentkezni
és biz igen, működik!
Köszönöm!
- A hozzászóláshoz be kell jelentkezni
A következő logikus kérdés, hogy honnan lehet tudni az xvputlit32 paraméterezését? Az ilyet én sem tudom fejlből, hanem megnézem a forrásban. Tanulságképpen ideírom még, hogy CCC3-ban xvputlit32(bin_buffer,num_offset,num_value) a paraméterezés.
- A hozzászóláshoz be kell jelentkezni
Köszönöm az infót :)
A problémát az jelentette, hogy c++ tudásom konvergál a 0-hoz, így nem jelentett túl sokat a forrása a függvénynek. Mégegyszer is köszönöm az infót :)
- A hozzászóláshoz be kell jelentkezni
Az xvgetbig32-nek meg lehet valahogy mondani, hogy a trailing 0-kat ne vágja le az eredményből?
- A hozzászóláshoz be kell jelentkezni
Az xvgetbig32() big endianban tárolt INT32-t olvas. Az eredmény egy szám. Nem vág le semmit.
--
CCC3
- A hozzászóláshoz be kell jelentkezni
és mi a teendő, hogyha az adott big endian Hexa reprezemtációját szeretném visszakapni?
- A hozzászóláshoz be kell jelentkezni
bytesorozat > xvgetbig32 > szám > l2hex > karaktersorozat
CCC3 példa:
function main()
local x:=x"0f000000" // 4 byte
? l2hex(xvgetbig32(x,0)) //kiírja: f000000
? l2hex(xvgetlit32(x,0)) //kiírja: f
--
CCC3
- A hozzászóláshoz be kell jelentkezni
Igen, viszont nekem létfontosságú, hogy "0f000000" -t kapjak vissza.
Egyébként félreértés ne essék, már mikor beposztoltam volt workaround hozzá:
padl(l2hex(xvgetbig31(x,0)),8,"0")
csak nem tetszik :D
- A hozzászóláshoz be kell jelentkezni
Ez nem workaround, hanem ez a működése.
--
CCC3
- A hozzászóláshoz be kell jelentkezni
Akkor nincs több kérdésem :D
- A hozzászóláshoz be kell jelentkezni
a kódrészlet bevezeti kérdésem:
non-standard memo kiolvasásához kell
fread(nMemohnd,@databuf,8) //
nbytes:=xvgetlit32(databuf,4) // amit ki akarok nyerni 00 00 00 0x17
az nbytes változó tartalma 35 (0x23) 23 (0x17) helyett.
hogy oldjam meg?
- A hozzászóláshoz be kell jelentkezni
Ebből nem értem, hogy mit akarsz csinálni.
--
CCC3
- A hozzászóláshoz be kell jelentkezni
a memo oldal hossza byte-okban.
a negyedik byte tartalmát akarom N típusú változóba írni.
konkrét esetben 23 helyett 35-öt kapok. (dec 23 az hexában 35)
ami nem felel meg. nekem a nekem az eredmény 23 kell legyen (hexa 17)
- A hozzászóláshoz be kell jelentkezni
Az xvgetlit32(buffer,offset) függvény a buffer-ből az offset pozíciótól kezdve kiolvas 4 byteot (32 bit), és ezt a 4 byteot intre konvertálja little endian (kis helyértékű byteok elől) számábrázolást feltételezve.
Ha neked egy byte kell, akkor használd az xvgetbyte függvényt,
--
CCC3
- A hozzászóláshoz be kell jelentkezni
kösz a gyors választ.
mielőtt a kérdést feltettem kipróbáltam minden indiánt (a big endian 32 megfelel)
nem tudom, hogy 1 vagy 4 byteba írják a mező hosszát.(valószínűleg 4 byte long int)
a gond az hogy a binárisan a byte tartalma 0010111 ami 23 -at jelent
// fread(hnd,buff,23) kellene
ehelyett a xvgetbig32 35-öt ad vissza tehát a 23 at hexa 23 -ként értelmezi
. amitöl szerencsére a fread elhasal és nem ír a bt memójába minden plusz szemetet.
- A hozzászóláshoz be kell jelentkezni
Tehát az az állítás, hogy az xvgetlit32 rossz?
--
CCC3
- A hozzászóláshoz be kell jelentkezni
dehogy,
azt állítom , hogy ezeket én nem tudom használni.
állítom , hogy szükség van referencia táblázatra, dokumentációra
hogy ne kérdezzek feleslegesen.
így oldottam meg
fread(nMemohnd,@databuf,8)
nbytes:=val(l2hex(xvgetbig32(databuf,4)))
fread(nMemohnd,@databuf,nbytes)
de nem biztos, hogy ez a legjobb.
nagyon sok új dolog van a CCC-ben annak, aki
se Clippert se C-t nem használt élesben.
elnézést a félreértésért
- A hozzászóláshoz be kell jelentkezni
Az a baj, hogy avval nem sokat tudok kezdeni, ha azt írod, hogy a függvény 23-at ad, de az nem felel meg, mert 49 kellene. Kézikönyvet sem tudok írni, helyette a forrást kell bogarászni.
fread(nMemohnd,@databuf,8)
Az nMmemhnd descriptorból próbál beolvasni 8 byteot a databuf-ba. Hogy ténylegesen hány byteot olvasott, az volna a return érték, amit nem vizsgálsz, tehát nem tudod, hogy mi van a bufferben az olvasás után.
nbytes:=val(l2hex(xvgetbig32(databuf,4)))
A databuf 0,1,2,3 bytejait nem nézed.
A databuf 4,5,6,7 bytejaiból kiolvasol egy számot, feltételezve, hogy az big endian ábrázolású, tehát a 4. byteon van a legnagyobb helyérték.
Ezt a számot az l2hex() függvény stringre konvertálja, a string a számot 16-os számrendszerben ábrázolja.
Ennek a stringnek az elejét a val() függvény újra számmá konvertálja. A stringből annyit használ fel, amennyi decimális ábrázolású számnak értelmezhető. Pl. ha az l2hex által adott string "1a" (dec 26), akkor az eredmény 1, mivel az "a" nem értelmezhető decimális számként.
Én erről a programról nem tudom eldönteni, hogy jó, vagy nem, mert, ha éppen erre van szükséged, akkor jó.
--
CCC3
- A hozzászóláshoz be kell jelentkezni
lehet e egyszerűbben?
a 4,5,6,7 byte - ból kiakarom olvasni a memo bejegyzés hosszát
az xvgetbig32() függvény return értékét ha N típusu változóba írom
akkor az nem lesz jó.
- A hozzászóláshoz be kell jelentkezni
Itt egy példaprogram:
function main()
local x:=bin(11)+bin(12)+bin(13)+bin(14);
+bin(1)+bin(2)+bin(3)+bin(4)
? len(x) //kiírja: 8
? l2hex(xvgetbig32(x,0)) //kiírja: b0c0d0e
? l2hex(xvgetlit32(x,0)) //kiírja: e0d0c0b
? l2hex(xvgetbig32(x,4)) //kiírja: 1020304
? l2hex(xvgetlit32(x,4)) //kiírja: 4030201
Nem ezzel kéne görcsölni, hanem meg kéne nézni az olvasás eredményét.
--
CCC3
- A hozzászóláshoz be kell jelentkezni
kösz a példaprogramot.
igazad van.
több próbálkozás és tábla olvasás után
maradt a
xvgetbig32()
ennél az memoformátumnál ez vált be
- A hozzászóláshoz be kell jelentkezni