Помогите разобраться в ниже следующем коде.
- Код: Выделить всё
using System;
using System.Linq;
class Program
{
static public String StringToHexString(String S)
{
return BitConverter.ToString(System.Text.Encoding.Default.GetBytes(S).ToArray()).Replace("-", "");
}
static public String ToReverseHexString(UInt64 S)
{
return BitConverter.ToString(BitConverter.GetBytes(S).ToArray()).Replace("-", "");
}
static void Main(String[] args)
{
String message = "Hello! Lets do something here.";
message = StringToHexString(message); //Byte[] bMessage = { (Byte)'H', (Byte)'e', (Byte)'l', (Byte)'l', (Byte)'o'//... };
//...
UInt64 uiM64 = Convert.ToUInt64(message.Substring(0, 16), 16);//"Hello! Lets do "
String temp = ToReverseHexString(uiM64);
uiM64 = Convert.ToUInt64(temp, 16);
}
}
Меня интересуют последние три строчки метода Main.
Так как вторая (метод StringToHexString) нивелируется использовав для данных целей сразу массив Byte.
Использование автором String, как я понимаю, оправданно для иллюстрации процесса, - показать что происходит с данными.
А вот первый вызов ToUInt64 делает то что я вынес в заголовок?
Мы берём строку из 16 символов (в примере это "Hello! Lets do ") и представляем её в виде целого значения UInt64?
Но ведь если вместо символа использовать один байта, то в одной переменной UInt64, с точки зрения Сишной унарной операции sizeof (проверялось на аналоге UInt64 - unsigned long long), там всего может находится 8 байт.
Понимание ситуация с другой стороны осложняется ещё тем что 16 в 16 степени вмещается в UInt64.
Оставшиеся две будут ясны если с этой разберусь. Вторая возвращает число UInt64 в виде 16ричной системе в 16 символьной переменной String.
P.S.
Вариант перевода в лоб на С++ проблем не возникает.
А вот человеческий перевод требует замены String на Byte[] ещё в CSharp варианте.
P.S.S.
В общем-то элементарные вещи спрашиваю, но боюсь без свежего взгляда со стороны не разберусь.
Предполагаю что на ответ на вопрос из заголовка должно быть (рассмотрим Си вариант) что-то на подобие
- Код: Выделить всё
unsigned long long SixteensBytesToUInt64(const unsigned char bVal[16])
{
unsigned long long ulVal = 0L;
//for(unsigned char i = 0; i < 16; i++)
ulVal |= bVal[0] << 24;
ulVal |= bVal[1] << 16;
ulVal |= bVal[2] << 8;
ulVal |= bVal[3];
return ulVal;
}
Это для варианта char [4] -> UInt64.