On 04/15/12 18:38, Giuliano Colla wrote: > I'm dealing with a large number of data coming from an external device. > They are big-endian 16 bits signed numbers, which must be converted to > integer and to real to perform calculations. > > Besides the obvious solutions of treating them as isolated bytes, > multipying by 256 the highest, adding the lower, and oring wit > $FFFF0000, or whatever sizeof(Integer) suggests if the result is bigger > than 32767, is there a more efficient and elegant way to achieve the > result? > > I'm a bit lost on all available data types, and unable to tell apart the > ones which are platform specific and the ones which are not, which > assignments give the proper result and which do not. > > Any suggestion would be greatly appreciated. > > Giuliano Colla > > There exists the BEtoN and LEtoN functions you can use.
There exists the BEtoN and LEtoN functions you can use. (NtoLE and NtoBE also) var Data: SmallInt; // 16 bit signed type ... Data := GetBENumberFromWherever; Data := BEtoN(Data); I'm not sure about real types. If they are 32 bits and sent in two pieces then you could just do var Data: Single; // 4 bytes DataArray: array[0..1] of Word absolute Data; ... // I'm not sure how the data is represented in memory for floats. DataArray[1] := BEtoN(Word(GetBENumberFromWherever)); DataArray[0] := BEtoN(Word(GetBENumberFromWherever)); Anyway you get the idea. Probably you will have to experiment to achieve exactly what you want. Someone else probably has a better answer. Regards, Andrew _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal