Forum » Programiranje » 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.
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?
prvo in drugo števko?
Ali številko in decimalko?
Skero
Zgodovina sprememb…
- spremenil: detroit ()
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…
- spremenil: commissar ()
KernelPanic ::
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.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...
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 ::
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" , 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).
KernelPanic ::
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 ::
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.
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;
}
union{
short s[2];
float f;
}
Zgodovina sprememb…
- spremenil: technolog ()
vojko20 ::
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.
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.
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 ::
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 ControlPogledal sem tudi v sistemski meni naprave, uporablja Big Endian varianto.
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.
Zgodovina sprememb…
- spremenil: KernelPanic ()
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".
Če se ne motim, ne delam več veliko s Cjem.
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 ...
joze67 ::
C# ekvivalent C++ union:
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.
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Neznan problem #2 [C]Oddelek: Programiranje | 1686 (1476) | videc |
» | [C] deljenjeOddelek: Programiranje | 1439 (1032) | joze67 |
» | c# - mssql kombinacija / problem pri zapisu row-a v bazoOddelek: Programiranje | 1614 (1423) | darkolord |
» | IBM-ov Mira cilja na vrh lestvice Top500Oddelek: Novice / Znanost in tehnologija | 5555 (4248) | HairyFotr |
» | [C#] int v byte[] in nazajOddelek: Programiranje | 1809 (1581) | BlueRunner |