2025-07-17 17:08:19 +02:00

180 lines
5.5 KiB
C#

using DomainObjects;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using skyscraper5.Skyscraper.Text;
namespace DVBServices
{
internal class Utils
{
/// <summary>
/// Convert a string of bytes to a hex string.
/// </summary>
/// <param name="inputChars">The string to be converted.</param>
/// <returns>The string of hex characters.</returns>
public static string ConvertToHex(byte[] inputChars)
{
return (ConvertToHex(inputChars, inputChars.Length));
}
/// <summary>
/// Convert a string of bytes to a hex string.
/// </summary>
/// <param name="inputChars">The array holding the bytes to be converted.</param>
/// <param name="length">The number of byte to be converted.</param>
/// <returns>The string of hex characters.</returns>
public static string ConvertToHex(byte[] inputChars, int length)
{
return (ConvertToHex(inputChars, 0, length));
}
/// <summary>
/// Convert a string of bytes to a hex string.
/// </summary>
/// <param name="inputChars">The array holding the bytes to be converted.</param>
/// <param name="offset">The the offset to the first byte to be converted.</param>
/// <param name="length">The number of byte to be converted.</param>
/// <returns>The string of hex characters.</returns>
public static string ConvertToHex(byte[] inputChars, int offset, int length)
{
char[] outputChars = new char[length * 2];
int outputIndex = 0;
for (int inputIndex = 0; inputIndex < length; inputIndex++)
{
int hexByteLeft = inputChars[offset] >> 4;
int hexByteRight = inputChars[offset] & 0x0f;
outputChars[outputIndex] = getHex(hexByteLeft);
outputChars[outputIndex + 1] = getHex(hexByteRight);
outputIndex += 2;
offset++;
}
return ("0x" + new string(outputChars));
}
private static char getHex(int value)
{
if (value < 10)
return ((char)('0' + value));
return ((char)('a' + (value - 10)));
}
/// <summary>
/// Get subset of bytes from an array.
/// </summary>
/// <param name="byteData">The array of bytes.</param>
/// <param name="offset">The index of the first byte of the subset.</param>
/// <param name="length">The length of the subset.</param>
/// <returns>The subset of bytes.</returns>
public static byte[] GetBytes(byte[] byteData, int offset, int length)
{
if (length < 1)
throw (new ArgumentOutOfRangeException("GetBytes length wrong"));
try
{
byte[] outputBytes = new byte[length];
for (int index = 0; index < length; index++)
outputBytes[index] = byteData[offset + index];
return (outputBytes);
}
catch (OutOfMemoryException)
{
throw (new ArgumentOutOfRangeException("GetBytes length wrong"));
}
}
/// <summary>
/// Convert 2 bytes to an integer with the most significant byte first.
/// </summary>
/// <param name="byteData">The byte array containing the byes to convert.</param>
/// <param name="index">The index of the first byte in the array.</param>
/// <returns>The converted value.</returns>
public static int Convert2BytesToInt(byte[] byteData, int index)
{
return (Convert2BytesToInt(byteData, index, 0xff));
}
/// <summary>
/// Convert 2 bytes to an integer with the most significant byte first and a mask.
/// </summary>
/// <param name="byteData">The byte array containing the byes to convert.</param>
/// <param name="index">The index of the first byte in the array.</param>
/// <param name="mask">The mask for the most significant byte.</param>
/// <returns>The converted value.</returns>
public static int Convert2BytesToInt(byte[] byteData, int index, byte mask)
{
return (((byteData[index] & mask) * 256) + (int)byteData[index + 1]);
}
private static En300468AnnexATextDecoder _encodingProvider;
/// <summary>
/// Convert a subset of an array of text bytes to a string.
/// </summary>
/// <param name="byteData">The array of bytes.</param>
/// <param name="offset">The index of the first byte to be converted.</param>
/// <param name="length">The number of bytes to be converted.</param>
/// <param name="replaceMode">Action to be taken for non-Ascii bytes.</param>
/// <returns>The converted string.</returns>
public static string GetString(byte[] byteData, int offset, int length, ReplaceMode replaceMode)
{
if (_encodingProvider == null)
{
_encodingProvider = En300468AnnexATextDecoder.GetInstance();
}
string temp = _encodingProvider.Decode(byteData, offset, length);
if (temp == null)
temp = "";
return temp;
}
/// <summary>
/// Convert an integer value to a hex string.
/// </summary>
/// <param name="value">The value to be converted.</param>
/// <returns>The converted string.</returns>
public static string ConvertToHex(int value)
{
if (value == 0)
return ("0x00");
uint tempValue = (uint)value;
char[] outputChars = new char[8];
int outputIndex = 7;
for (int index = 3; index > -1; index--)
{
uint hexByte = (tempValue << 24) >> 24;
int hexByteLeft = (int)(hexByte >> 4);
int hexByteRight = (int)(hexByte & 0x0f);
outputChars[outputIndex] = getHex(hexByteRight);
outputChars[outputIndex - 1] = getHex(hexByteLeft);
outputIndex -= 2;
tempValue = tempValue >> 8;
}
string replyString = new string(outputChars).TrimStart(new char[] { '0' });
if (replyString.Length % 2 == 0)
return ("0x" + replyString);
else
return ("0x0" + replyString);
}
}
}