Plasma GitLab Archive
Projects Blog Knowledge

Module Netnumber


module Netnumber: sig .. end
Binary encodings of numbers


This is the successor of the Rtypes module

Numeric types


type int4 
32 bit signed integer
type int8 
64 bit signed integer
type uint4 
32 bit unsigned integer
type uint8 
64 bit unsigned integer
type fp4 
single precision float (IEEE "float")
type fp8 
double precision float (IEEE "double")
exception Cannot_represent of string
raised if a conversion can't be done
exception Out_of_range
raised if string position out of range

Basic encoding/decoding functions


val mk_int4 : char * char * char * char -> int4
val mk_int8 : char * char * char * char * char * char * char * char -> int8
val mk_uint4 : char * char * char * char -> uint4
val mk_uint8 : char * char * char * char * char * char * char * char -> uint8
mk_<t> create integer values from character tuples. In these tuples the MSB is the first component and the LSB the last.
val dest_int4 : int4 -> char * char * char * char
val dest_int8 : int8 -> char * char * char * char * char * char * char * char
val dest_uint4 : uint4 -> char * char * char * char
val dest_uint8 : uint8 -> char * char * char * char * char * char * char * char
dest_<t> destroy integer values and returns the corresponding char tuples.
val mk_fp4 : char * char * char * char -> fp4
val mk_fp8 : char * char * char * char * char * char * char * char -> fp8
val dest_fp4 : fp4 -> char * char * char * char
val dest_fp8 : fp8 -> char * char * char * char * char * char * char * char

Conversions



Conversions from int to (u)int and vice versa. On 32-bit computers, the type int can hold 31-bit signed integers (including the sign, i.e. one bit cannot be used). On 64-bit computers, the type int can hold 63-bit signed integers (including the sign, i.e. one bit cannot be used). The int_of_xxx functions raise Cannot_represent if the number to convert is too big (or too small) to be represented as int. Note that this depends on the word size of your architecture.
val int_of_int4 : int4 -> int
val int_of_uint4 : uint4 -> int
val int_of_int8 : int8 -> int
val int_of_uint8 : uint8 -> int
val int4_of_int : int -> int4
val uint4_of_int : int -> uint4
val int8_of_int : int -> int8
val uint8_of_int : int -> uint8
val int32_of_int4 : int4 -> int32
val int32_of_uint4 : uint4 -> int32
val int32_of_int8 : int8 -> int32
val int32_of_uint8 : uint8 -> int32
val int4_of_int32 : int32 -> int4
val uint4_of_int32 : int32 -> uint4
val int8_of_int32 : int32 -> int8
val uint8_of_int32 : int32 -> uint8
val int64_of_int4 : int4 -> int64
val int64_of_uint4 : uint4 -> int64
val int64_of_int8 : int8 -> int64
val int64_of_uint8 : uint8 -> int64
val int4_of_int64 : int64 -> int4
val uint4_of_int64 : int64 -> uint4
val int8_of_int64 : int64 -> int8
val uint8_of_int64 : int64 -> uint8

Casts from uint4/uint8 to int32/int64. Here, the sign is ignored and simply considered as a bit.
val logical_uint4_of_int32 : int32 -> uint4
val logical_int32_of_uint4 : uint4 -> int32
val logical_uint8_of_int64 : int64 -> uint8
val logical_int64_of_uint8 : uint8 -> int64
val fp8_of_fp4 : fp4 -> fp8
val fp4_of_fp8 : fp8 -> fp4
Note fp4_of_fp8: This conversion is not exact. It is quite normal that precision is lost. Numbers too small or too large for fp4 are converted to the "infinity" value.
val float_of_fp4 : fp4 -> float
val float_of_fp8 : fp8 -> float
val fp4_of_float : float -> fp4
val fp8_of_float : float -> fp8
Note fp4_of_float: The same problems as in fp4_of_fp8 may arise

Comparisons



The comparisons "=" and "<>" work for all numbers.

For signed integers, the operators "<", "<=", ">", and ">=" work, too. The unsigned integer type use representation that are not compatible with these operators, and the following functions need to be called.

For fp4 and fp8 there are no comparison functions - convert to float first and compare then.

val lt_uint4 : uint4 -> uint4 -> bool
lt_uint4 is true iff the first value is less than the second value as unsigned int
val le_uint4 : uint4 -> uint4 -> bool
val gt_uint4 : uint4 -> uint4 -> bool
val ge_uint4 : uint4 -> uint4 -> bool
Other comparisons
val lt_uint8 : uint8 -> uint8 -> bool
lt_uint8 is true iff the first value is less than the second value as unsigned int
val le_uint8 : uint8 -> uint8 -> bool
val gt_uint8 : uint8 -> uint8 -> bool
val ge_uint8 : uint8 -> uint8 -> bool
Other comparisons
module type ENCDEC = sig .. end
module BE: ENCDEC 
Encoders/decoders for big endian - network byte order
module LE: ENCDEC 
Encoders/decoders for little endian
module HO: ENCDEC 
Encoders/decoders for host byte order - which is either little endian or big endian, depending on the CPU (or CPU mode)
This web site is published by Informatikbüro Gerd Stolpmann
Powered by Caml