[comp.lang.ada] "Integer" value of a CHARACTER

stachour@sctc.com (Paul Stachour) (11/29/90)

  I have this "simple" problem.  I have something that I need
its internal representation of.  I need this to calculate a
checksum or a hash-value or ...  I really don't even care what
the value is, or plan to do anything neat-o with it.  I just
need it to be repeatable.
  In the (simplified) example below, I am trying to get a hash-value
from several characters in a string.  However, I seem to get problems
in doing this.  In the example given, I get "constraint-error" on the
attempt to do the "conversion". (V_Name is a 60-char string with an
OK name in it, the first character is a "c".)

  What am I doing wrong?  How should I be doing it?
[Unchecked conversion between an 8-bit character and an
integer is not guarenteed either, is it?  Or do I work
with some particular range of integer?]

-- ********************************************************** --
function Hash_Name(
    The_Name                          : in V_Name ) 
  return Positive is
  C:                                    STRING(1..1);
begin
   C(1) := The_Name(1);
   return POSITIVE'VALUE(C(1..1));
--1      return POSITIVE'VALUE(The_Name(1));
end;

-- ********************************************************** --

-- 
Paul Stachour         Secure Computing Technology Corp
stachour@sctc.com      1210 W. County Rd E, Suite 100           
		 	   Arden Hills, MN  55112
                             [1]-(612) 482-7467

murphy@mips.COM (Mike Murphy) (11/30/90)

In article <1990Nov28.210856.14960@sctc.com> stachour@sctc.com (Paul Stachour) writes:
>
>  In the (simplified) example below, I am trying to get a hash-value
>from several characters in a string.  However, I seem to get problems
>in doing this.  In the example given, I get "constraint-error" on the
>attempt to do the "conversion". (V_Name is a 60-char string with an
>OK name in it, the first character is a "c".)
>
>-- ********************************************************** --
>function Hash_Name(
>    The_Name                          : in V_Name ) 
>  return Positive is
>  C:                                    STRING(1..1);
>begin
>   C(1) := The_Name(1);
>   return POSITIVE'VALUE(C(1..1));
>--1      return POSITIVE'VALUE(The_Name(1));
>end;
>-- ********************************************************** --

The type'VALUE(string) attribute returns the type-value that the
string image represents.  Thus POSITIVE'VALUE("12") = 12, 
while POSITIVE'VALUE("cat") raises constraint_error, because "cat"
is not the image of a positive number.  To get a hash value,
you want to use the 'POS attribute, e.g.
	CHARACTER'POS(The_Name(1)) = character'pos('c') = 99
To get a real hash value you probably want to do some arithmetic
on the 'pos values of more than one character in the string.

If you want to use unchecked_conversion, you could convert four
characters at a time to integer (assuming 4-byte integers), or
convert one character to a tiny_integer (or whatever 1-byte integer
your implementation defines):
	function to_int is new unchecked_conversion (string, integer);
	function to_tint is new unchecked_conversion (character, tiny_integer);
	integer_obj := to_int(The_Name(1..4));
	tiny_integer_obj := to_tint(The_Name(1));
		-- this is essentially the same as doing a 'pos.