Convert to and from Clock & Data format


using System;
using System.Text;
using System.Collections.Generic;
					
public class Program
{
	public static string Convert2ClockAndData(string text)
    {
        if (!decimal.TryParse(text, out decimal d))
        {
            return null;
        }

        int[] dBits = decimal.GetBits(d);
		
        
        // Convert each part to hex and apply necessary padding
        string part3 = dBits[3].ToString("X2");   // Sign and scale factor (ensure 2 characters)
        string part2 = dBits[2].ToString("X2");   // Most significant 32 bits (ensure 2 characters)
        string part1 = dBits[1].ToString("X8");   // Middle 32 bits (ensure 8 characters)
        string part0 = dBits[0].ToString("X8");   // Least significant 32 bits (ensure 8 characters)

        // Concatenate the hex parts
        string hexData = part3 + part2 + part1 + part0;


        // Ensure even-length hex string
        if (hexData.Length % 2 != 0)
        {
            hexData = hexData.StartsWith("0") ? hexData[1..] : "0" + hexData;
        }

		
		
        // Reverse byte order (two characters at a time)
        string reversedHex = "";
        for (int i = 0; i < hexData.Length; i += 2)
        {
            reversedHex = hexData.Substring(i, 2) + reversedHex;
        }

        return reversedHex;
    }
	
    public static string ConvertFromClockAndData(string clockAndData)
    {
		string hexData = "";
        for (int i = 0; i < clockAndData.Length; i += 2)
        {
            hexData = clockAndData.Substring(i, 2) + hexData;
        }
		
		string part0 = hexData[^8..];
		string part1 = hexData[^16..^8];
		string part2 = hexData[^18..^16];
		string part3 = hexData[..^18];
		if (string.IsNullOrEmpty(part3)) {
			part3 = "00";
		}
		
		int[] dBits = new int[4];
		dBits[0] = int.Parse(part0, System.Globalization.NumberStyles.HexNumber);
		dBits[1] = int.Parse(part1, System.Globalization.NumberStyles.HexNumber);
		dBits[2] = int.Parse(part2, System.Globalization.NumberStyles.HexNumber);
		dBits[3] = int.Parse(part3, System.Globalization.NumberStyles.HexNumber);
		
		decimal d = new decimal(dBits);
		
		return d.ToString();

    }
	
	
	public static void Main() {
	
	}
}


Post a Comment

Previous Post Next Post