» »

c# - pretvorba short[2] v float

c# - pretvorba short[2] v float

KernelPanic ::

Spostovani!
Moja malenkost bi spet prosila na pomoc. Namrec, v komunikacijskem softweru z napravo berem temperaturo, ki jo hrani naprava. Podatek dobim v obliki arraya short[2], vendar v dokumentaciji naprave pise, da je podatek tipa float, kar je logicno, ce gre za temperaturo. Torej, kako naj ta array pretvorim v float tip. Pisem v .NET Framework 4 in c# programskem jeziku.

Mi lahko kdo pomaga in vnaprej se zahvaljujem za pomoc,
M.

detroit ::

Mogoče sm glup ampak kaj vsak od teh shortov predstavlja?
prvo in drugo števko?
Ali številko in decimalko?
Skero

Zgodovina sprememb…

  • spremenil: detroit ()

Senitel ::

Verjetno spodnja dva bajta in zgornja dva bajta od floata.

commissar ::

hitra rešitev za senitelov primer

            short s1 = 0;
            short s2 = 12;
            
            var c = BitConverter.GetBytes(s1);
            var d = BitConverter.GetBytes(s2);

            var e =new byte[] { c[1], c[0], d[1], d[0] };  //mal se igraj z vrstnim redom taga, dokler ne dobiš pričakovane temperature

            var f = BitConverter.ToSingle(e,0);

AndyS ::

KernelPanic je izjavil:

Spostovani!
Moja malenkost bi spet prosila na pomoc. Namrec, v komunikacijskem softweru z napravo berem temperaturo, ki jo hrani naprava. Podatek dobim v obliki arraya short[2], vendar v dokumentaciji naprave pise, da je podatek tipa float, kar je logicno, ce gre za temperaturo. Torej, kako naj ta array pretvorim v float tip. Pisem v .NET Framework 4 in c# programskem jeziku.

Mi lahko kdo pomaga in vnaprej se zahvaljujem za pomoc,
M.


Ti si verjetno eden tistih, ki se skozi cel faks/šolo šlepajo z delom drugih a? Če ni točno po reglcih, se vse ustavi...

commissar ::

heh, še v službi (če je to za službo) se šlepa z delom drugih očitno :D

Zgodovina sprememb…

KernelPanic ::

AndyS je izjavil:

KernelPanic je izjavil:

Spostovani!
Moja malenkost bi spet prosila na pomoc. Namrec, v komunikacijskem softweru z napravo berem temperaturo, ki jo hrani naprava. Podatek dobim v obliki arraya short[2], vendar v dokumentaciji naprave pise, da je podatek tipa float, kar je logicno, ce gre za temperaturo. Torej, kako naj ta array pretvorim v float tip. Pisem v .NET Framework 4 in c# programskem jeziku.

Mi lahko kdo pomaga in vnaprej se zahvaljujem za pomoc,
M.


Ti si verjetno eden tistih, ki se skozi cel faks/šolo šlepajo z delom drugih a? Če ni točno po reglcih, se vse ustavi...
A tukaj ne gre brez raznih nepotrebnih komentarjev, kot da ti ves vse na tem svetu ... Jaz sem se na faksu trudil in ga koncal SAM, ne poznas moje situacije, zato bodi raje tiho. Ali ni zanimivo, da se taksni komentatorji (varianta tale AndyS) najdejo samo na slovenskih forumih? Drugic bom raje vprasal drugje. In commisar, NE SLEPAM SE Z DELOM DRUGIH, ampak sodelavec pizdun me je namocil v drek in namesto njega sedaj delam to JAZ.

S spostovanjem,
M.

commissar ::

no pomiri se. Moj komentar je bil mišljen bolj na to, da ČE(!!!) si šel tako čez faks potem pač pojdi še tako čez službo.

KernelPanic ::

commissar je izjavil:

no pomiri se. Moj komentar je bil mišljen bolj na to, da ČE(!!!) si šel tako čez faks potem pač pojdi še tako čez službo.

haha, ok, malo se zivcen, ker mi sef sedi za hrbtom in mi dobesedno vsake pol ure tezi "a je ze" :D, problem pa je, ker pisem dva programa na1x (se za tega gnoja sodelavca, me je zajebal fino) in sem ze cisto zmesan (vceraj sem bil do pol enih zjutraj v sluzbi, do sestih sel spat domov in nato zopet nazaj).

nhjghvfhj ::

Upam da se ti vsaj financno da tvoje delo trpet, če ne pojdi raje v proizvodnjo.

KernelPanic ::

nhjghvfhj je izjavil:

Upam da se ti vsaj financno da tvoje delo trpet, če ne pojdi raje v proizvodnjo.
Ja ni vse v denarju ane, posebej v teh casih, ko sluzbe ne rastejo ko gobe po dezju, obljubil sem, da bom naredil in konec.

AndyS ::

Svoj post sem napisal, ker se ti očitno pri najmanjših nestandradnih problemih ustavi.. Največkrat je za tvoje probleme potrebno ali 5min uporabe googla ali pa par poskusov in enostaven debuging (vsekakor pa manj časa kot ti vzame pisanje posta in čakanje odgovora)... Nisem hotel žaliti tebe ali tvojega dela/situacije, ampak premisli o svoji iznajdljivosti ( + to kar sam najdeš/ugotoviš si zapomniš za 10x dlje)..

KernelPanic ::

AndyS je izjavil:

Svoj post sem napisal, ker se ti očitno pri najmanjših nestandradnih problemih ustavi.. Največkrat je za tvoje probleme potrebno ali 5min uporabe googla ali pa par poskusov in enostaven debuging (vsekakor pa manj časa kot ti vzame pisanje posta in čakanje odgovora)... Nisem hotel žaliti tebe ali tvojega dela/situacije, ampak premisli o svoji iznajdljivosti ( + to kar sam najdeš/ugotoviš si zapomniš za 10x dlje)..
To je vse res in v vecini imas prav, ampak poanta je, da se mi je mudilo in zato sem prosil za pomoc, ker vem, da ste tukaj "tapravi" za taksne debate. Je pa tudi res, da teh premetavanj bitov nisem doceloma nikoli osvojil in da se bom moral to nauciti, saj ni to nek ultra high rocket science. :D

Spura ::

Isto vprasanje se je tudi meni zastavilo. Ampak ok vsaj nimas nicka Java Master (ki si potem ne zna vezalk zavezat v javi - so to speak).:))

technolog ::

Je možnost da program napišeš v C++? Tam so stvari enostavnejše, če se dela bolj low-level.

union{
short s[2];
float f;
}

Zgodovina sprememb…

vojko20 ::

commissar je izjavil:

hitra rešitev za senitelov primer

 short s1 = 0;
short s2 = 12;

var c = BitConverter.GetBytes(s1);
var d = BitConverter.GetBytes(s2);

var e =new byte[] { c[1], c[0], d[1], d[0] }; //mal se igraj z vrstnim redom taga, dokler ne dobiš pričakovane temperature

var f = BitConverter.ToSingle(e,0);


Lahko tudi z bit shiftanjem.

short msb = 100;
short lsb = 500;
int r = (msb << 16) + lsb;


EDIT:
aja spregledal da rabiš float, ja uporabi bitconverterja :)

Zgodovina sprememb…

  • spremenilo: vojko20 ()

KernelPanic ::

Matr, v masini je v short[2] zapisana vrednost 15.0 in nikakor je ne morem dobiti na PCju, ko jo preberem, nekaj ni ok ... Zaporedje bitov sem premesal na vse mozne nacine ...

Senitel ::

Jah dejansko še vedno nisi povedal kaj ta dva shorta sploh naj bi bila? Glej lepo čisto na začetek teme, prva dva odgovora.

KernelPanic ::

No, ko preberem ta dva shorta, glede na dokumentacijo, skupaj tvorita podatek tipa float, ki predstavlja izmerjeno temperaturo sonde v stopinjah celzija. V napravi ima ta podatek vrednost 15.0 (ce pogledas log file fizicno na napravi, je ta vrednost 15.0 stopinj celzija). Z mojo aplikacijo pa jaz preberem vse loge iz naprave in jih shranjujem v bazo, vendar temperaturo mi napacno interpretira, nikakor ne morem dobiti vrednosti 15.0.

xordie ::

float je torej 15.0.

kaksna pa sta short[0] in short [1], ki ju dobis?
x

KernelPanic ::

short[0]=0;
short[1]=17487;

MrBrdo ::

Poglej kakšen format sploh uporablja naprava za shranjevanje float-ov. Večina računalnikov npr. uporablja IEEE 754 standard, ni pa nujno da tudi naprava uporablja ta format (pa tudi v okviru tega standarda je več različnih formatov, npr. binary32 in decimal32 - glej wiki)... Brez tega podatka lahko samo ugibaš. Glede na to da ti ne uspe prevesti vrednosti tudi z obračanjem bitov, smatram da naprava uporablja drug standard za shranjevanje float-ov.

Za vsak slučaj preveri najprej še v C++, kjer se da bolj "logično" pretvarjati v smislu da narediš pointer na float (float *) in ga potem castaš v pointer na short (short *), in vpišeš tedva shorta, potem pa izpišeš vrednost floata.
MrBrdo

Zgodovina sprememb…

  • spremenilo: MrBrdo ()

KernelPanic ::

MrBrdo je izjavil:

Poglej kakšen format sploh uporablja naprava za shranjevanje float-ov. Večina računalnikov npr. uporablja IEEE 754 standard, ni pa nujno da tudi naprava uporablja ta format (pa tudi v okviru tega standarda je več različnih formatov, npr. binary32 in decimal32 - glej wiki)... Brez tega podatka lahko samo ugibaš. Glede na to da ti ne uspe prevesti vrednosti tudi z obračanjem bitov, smatram da naprava uporablja drug standard za shranjevanje float-ov.
To sem ze prebral v literaturi, kot sem razumel, naprava dela na IEEE754, citiram iz prirocnika:
Floating Point Endian Control
Floating-point numbers are not defined in the Modbus
specification; there are nearly as many variations
of how it is supported, as there are vendors.
Most often, Modbus registers are combined sequentially
to make up an IEEE single precision or double
precision floating point number; this is the case in
the AccuLoad III. Two registers are needed for single
precision and four for double precision numbers.
There are, however, several ways to map floating
point values to Modbus registers. To assure compatibility
with off-the-shelf drivers, three popular variations
of byte ordering for floating point numbers are
supported.
Pogledal sem tudi v sistemski meni naprave, uporablja Big Endian varianto.

Zgodovina sprememb…

MrBrdo ::

Jah še ta byte ordering si poglej (imej v mislih da je short 2x byte)... Pa kot sem popravil zgoraj, probaj še v C++, kjer je pretvorba malo bolj "logična".
float *f = new float; // ali malloc(sizeof(float))
short *s = (short *)f;
s[0] = ...;
s[1] = ...;
printf("%f\n", *f);

Če se ne motim, ne delam več veliko s Cjem.
MrBrdo

Zgodovina sprememb…

  • spremenilo: MrBrdo ()

KernelPanic ::

Ne morem spisati v C++, ker nimam na sluzbenem racunalniku drugega kot c#, ne morem pa nic instalirati ... politika admina ...

Senitel ::

Am... Kakor koli obrnem 17487 meni ne uspe prit do česarkoli podobnega 15.

joze67 ::

C# ekvivalent C++ union:

    class Program
    {

        [StructLayout(LayoutKind.Explicit)]
        public struct Union
        {
            [FieldOffset(0)]
            public short s1;
            [FieldOffset(2)]
            public int s2;
            [FieldOffset(0)]
            public float f;
        }   

        static void Main(string[] args)
        {
            Union u = new Union();
            u.f = 15.0F;
            Console.WriteLine(string.Format("s1={0} ({0:X}), s2={1} ({1:X}), f={2}", u.s1, u.s2, u.f));
            u.s1 = 0;
            u.s2 = 17487;
            Console.WriteLine(string.Format("s1={0} ({0:X}), s2={1} ({1:X}), f={2}", u.s1, u.s2, u.f));
            u.s2 = 0;
            u.s1 = 17487;
            Console.WriteLine(string.Format("s1={0} ({0:X}), s2={1} ({1:X}), f={2}", u.s1, u.s2, u.f));
        }
    }

Rezultat je seveda "napačen":
s1=0 (0), s2=16752 (4170), f=15
s1=0 (0), s2=17487 (444F), f=828
s1=17487 (444F), s2=0 (0), f=2,450451E-41
Iz hex številk je jasno, da ni stvar samo v vrstnem redu bytov.

KernelPanic ::

Ja pa kje je potem napaka, mar berem narobe pozicijo bufferja? ;(( Samo sedaj pa nisem vec v sluzbi, bom v ponedeljek sporocil, ce sem splho pravilno bral. ;(( Kreten jaz.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Neznan problem #2 [C]

Oddelek: Programiranje
91674 (1464) videc
»

[C] deljenje

Oddelek: Programiranje
181431 (1024) joze67
»

c# - mssql kombinacija / problem pri zapisu row-a v bazo

Oddelek: Programiranje
121598 (1407) darkolord
»

IBM-ov Mira cilja na vrh lestvice Top500

Oddelek: Novice / Znanost in tehnologija
275521 (4214) HairyFotr
»

[C#] int v byte[] in nazaj

Oddelek: Programiranje
131801 (1573) BlueRunner

Več podobnih tem