Question
· Apr 27, 2023

checksum calculation, , shift byte

How to translate below code from C to COS?

 

void encode_value (unsigned char value, unsigned char *tx)

{

 tx [1] = ((value & 0xf0) >> 4) + 0x20;

tx [0] = (value & 0x0f) + 0x20;

}

unsigned char decode_value (unsigned char *rx)

{ unsigned char temp_value = 0; temp_value = (rx [1] - 0x20) << 4;

return (temp_value + rx [0] - 0x20);

}

Product version: Caché 2018.1
Discussion (2)1
Log in or sign up to continue

COS does not have a pointer operator so instead of "unsigned *rx and *tx" (those are char arrays) in COS you can use string variables. By the way, C counts from 0 to N-1, COS counts from 1 to N, where N ist the size of the character array respectively the length of the string.

Class DC.CtoCOS [ Abstract ]
{

/// Encode a whole string (and return a string)
/// Use the below $ziswide(str) function to check for allowed characters
ClassMethod Encode(str As %String) As %String
{
	f i=$l(str):-1:1 s $e(str,i)=$c($a(str,i)#16+32, $a(str,i)\16+32)
	q str
}

/// Decode a whole string (and return a string)
/// Use the below $match(str,...) function to check for allowed characters
ClassMethod Decode(str As %String) As %String
{
	f i=$l(str):-2:1 s $e(str,i-1,i)=$c($a(str,i)-32*16+$a(str,i-1)-32)
	q str
}

/// Encode a characyter into a string (variable)
/// Use: do ##class(...).Encode1("A", .res)
///      write res --> !$
ClassMethod Encode1(chr As %String, chrs As %String)
{
	i $ziswide(chr) throw ##class(%Exception.General).%New("WIDE",,,chr)
	s chrs=$c($a(chr)#16+32, $a(chr)\16+32)
}

/// Encode an integer (byte value) and return a string
/// Use: write ##class(...).Encode2("A") --> !$
ClassMethod Encode2(val As %Integer) As %String
{
	i val>255 throw ##class(%Exception.General).%New("WIDE",,,val)
	q $c($a(val)#16+32, $a(val)\16+32)
}

/// Decode two characters and return one character
/// Use: write ##class(...).Decode1("!$") --> A
ClassMethod Decode1(chrs As %String) As %String
{
	i $match(chrs,"[ -/]{2}") q $c($a(chrs,2)-32*16+$a(chrs)-32)
	throw ##class(%Exception.General).%New("RANGE",,,chrs)
}

/// Decode two characters and return an integer
/// Use: write ##class(...).Decode2("!$") --> 65
ClassMethod Decode2(chrs As %String) As %Integer
{
	i $match(chrs,"[ -/]{2}") q $a(chrs,2)-32*16+$a(chrs)-32
	throw ##class(%Exception.General).%New("RANGE",,,chrs)
}

}