Hex2Decimal.ecl 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. //
  2. // Example code - use without restriction.
  3. //
  4. HexStr2Decimal(STRING HexIn) := FUNCTION
  5. //type re-definitions to make code more readable below
  6. BE1 := BIG_ENDIAN UNSIGNED1;
  7. BE2 := BIG_ENDIAN UNSIGNED2;
  8. BE3 := BIG_ENDIAN UNSIGNED3;
  9. BE4 := BIG_ENDIAN UNSIGNED4;
  10. BE5 := BIG_ENDIAN UNSIGNED5;
  11. BE6 := BIG_ENDIAN UNSIGNED6;
  12. BE7 := BIG_ENDIAN UNSIGNED7;
  13. BE8 := BIG_ENDIAN UNSIGNED8;
  14. TrimHex := TRIM(HexIn,ALL);
  15. HexLen := LENGTH(TrimHex);
  16. UseHex := IF(HexLen % 2 = 1,'0','') + TrimHex;
  17. //a sub-function to translate two hex chars to a packed hex format
  18. STRING1 Str2Data(STRING2 Hex) := FUNCTION
  19. UNSIGNED1 N1 := CASE(Hex[1],
  20. '0'=>00x,'1'=>10x,'2'=>20x,'3'=>30x,
  21. '4'=>40x,'5'=>50x,'6'=>60x,'7'=>70x,
  22. '8'=>80x,'9'=>90x,'A'=>0A0x,'B'=>0B0x,
  23. 'C'=>0C0x,'D'=>0D0x,'E'=>0E0x,'F'=>0F0x,00x);
  24. UNSIGNED1 N2 := CASE(Hex[2],
  25. '0'=>00x,'1'=>01x,'2'=>02x,'3'=>03x,
  26. '4'=>04x,'5'=>05x,'6'=>06x,'7'=>07x,
  27. '8'=>08x,'9'=>09x,'A'=>0Ax,'B'=>0Bx,
  28. 'C'=>0Cx,'D'=>0Dx,'E'=>0Ex,'F'=>0Fx,00x);
  29. RETURN (>STRING1<)(N1 | N2);
  30. END;
  31. UseHexLen := LENGTH(TRIM(UseHex));
  32. InHex2 := Str2Data(UseHex[1..2]);
  33. InHex4 := InHex2 + Str2Data(UseHex[3..4]);
  34. InHex6 := InHex4 + Str2Data(UseHex[5..6]);
  35. InHex8 := InHex6 + Str2Data(UseHex[7..8]);
  36. InHex10 := InHex8 + Str2Data(UseHex[9..10]);;
  37. InHex12 := InHex10 + Str2Data(UseHex[11..12]);
  38. InHex14 := InHex12 + Str2Data(UseHex[13..14]);
  39. InHex16 := InHex14 + Str2Data(UseHex[15..16]);
  40. RETURN CASE(UseHexLen,
  41. 2 =>(STRING)(>BE1<)InHex2,
  42. 4 =>(STRING)(>BE2<)InHex4,
  43. 6 =>(STRING)(>BE3<)InHex6,
  44. 8 =>(STRING)(>BE4<)InHex8,
  45. 10=>(STRING)(>BE5<)InHex10,
  46. 12=>(STRING)(>BE6<)InHex12,
  47. 14=>(STRING)(>BE7<)InHex14,
  48. 16=>(STRING)(>BE8<)InHex16,
  49. 'ERROR');
  50. END;
  51. OUTPUT(HexStr2Decimal('0101')); // 257
  52. OUTPUT(HexStr2Decimal('FF')); // 255
  53. OUTPUT(HexStr2Decimal('FFFF')); // 65535
  54. OUTPUT(HexStr2Decimal('FFFFFF')); // 16777215
  55. OUTPUT(HexStr2Decimal('FFFFFFFF')); // 4294967295
  56. OUTPUT(HexStr2Decimal('FFFFFFFFFF')); // 1099511627775
  57. OUTPUT(HexStr2Decimal('FFFFFFFFFFFF')); // 281474976710655
  58. OUTPUT(HexStr2Decimal('FFFFFFFFFFFFFF')); // 72057594037927935
  59. OUTPUT(HexStr2Decimal('FFFFFFFFFFFFFFFF')); // 18446744073709551615
  60. OUTPUT(HexStr2Decimal('FFFFFFFFFFFFFFFFFF')); // ERROR