bináris kódolás

Fórumok

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)

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?

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)

Az xvgetbig32-nek meg lehet valahogy mondani, hogy a trailing 0-kat ne vágja le az eredményből?

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

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.

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

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

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