// Пример 16. Двоичное и шестнадцатеричное представление целочисленных переменных в скрипте.

int len=256;
char str[len];
char str1[len];
char str2[len];
unsigned char uc;

Primer16()
{

  print(" В примере рассмотрены только целочисленные типы.");
  print("");

// -----------------------------------------------------------------------------------------------
  unsigned char x1='ц';

        print("1. unsigned char");
        print("   В памяти занимает 1 байт");
  sprintf(str,"   Отображается как                  %9c",x1); print(str);
  sprintf(str,"   десятичное представление          %9d",x1); print(str);
  sprintf(str,"   двоичное представление            %9.9s",ByteToBin(x1)); print(str);
  sprintf(str,"   шестнадцатириченое представление  %9.9s",ByteToHex(x1)); print(str);

  print("");

// ---------------------------------------------------------------------------------------------
  char x2='ц';

        print("2. char");
        print("   В памяти занимает 1 байт");
  sprintf(str,"   Отображается как                  %9c",x2); print(str);
  sprintf(str,"   десятичное представление          %9d",x2); print(str);
  sprintf(str,"   двоичное представление            %9.9s",ByteToBin(x2)); print(str);
  sprintf(str,"   шестнадцатириченое представление  %9.9s",ByteToHex(x2)); print(str);

  print("");

// ---------------------------------------------------------------------------------------------
  
  unsigned short x3=45617;
        print("3. unsigned short");
        print("   В памяти занимает 2 байта");
  sprintf(str,"   Отображается как                  %d",x3); print(str);
  sprintf(str,"   десятичное представление          %d",x3); print(str);
  sprintf(str,"   двоичное представление            %s",NumbToBin(x3,2)); print(str);
  sprintf(str,"   шестнадцатириченое представление  %s",NumbToHex(x3,2)); print(str);

  print("");

// ---------------------------------------------------------------------------------------------
  short x4=45617;
        print("4. short");
        print("   В памяти занимает 2 байта");
  sprintf(str,"   Отображается как                  %d",x4); print(str);
  sprintf(str,"   десятичное представление          %d",x4); print(str);
  sprintf(str,"   двоичное представление            %s",NumbToBin(x4,2)); print(str);
  sprintf(str,"   шестнадцатириченое представление  %s",NumbToHex(x4,2)); print(str);

  print("");

// ---------------------------------------------------------------------------------------------
  
  unsigned int x5=2185614092;
        print("5. unsigned int");
        print("   В памяти занимает 4 байта");
  sprintf(str,"   Отображается как                  %d",x5); print(str);
  sprintf(str,"   десятичное представление          %d",x5); print(str);
  sprintf(str,"   двоичное представление            %s",NumbToBin(x5,4)); print(str);
  sprintf(str,"   шестнадцатириченое представление  %s",NumbToHex(x5,4)); print(str);

  print("");

// ---------------------------------------------------------------------------------------------
  
  int x6=2185614092;
        print("6. int");
        print("   В памяти занимает 4 байта");
  sprintf(str,"   Отображается как                  %d",x6); print(str);
  sprintf(str,"   десятичное представление          %d",x6); print(str);
  sprintf(str,"   двоичное представление            %s",NumbToBin(x6,4)); print(str);
  sprintf(str,"   шестнадцатириченое представление  %s",NumbToHex(x6,4)); print(str);

  print("");

// ---------------------------------------------------------------------------------------------
  
  unsigned long x7=2185614092;
        print("7. unsigned long");
        print("   В памяти занимает 4 байта");
  sprintf(str,"   Отображается как                  %d",x7); print(str);
  sprintf(str,"   десятичное представление          %d",x7); print(str);
  sprintf(str,"   двоичное представление            %s",NumbToBin(x7,4)); print(str);
  sprintf(str,"   шестнадцатириченое представление  %s",NumbToHex(x7,4)); print(str);

  print("");

// ---------------------------------------------------------------------------------------------
  
  long x8=2185614092;
        print("8. long");
        print("   В памяти занимает 4 байта");
  sprintf(str,"   Отображается как                  %d",x8); print(str);
  sprintf(str,"   десятичное представление          %d",x8); print(str);
  sprintf(str,"   двоичное представление            %s",NumbToBin(x8,4)); print(str);
  sprintf(str,"   шестнадцатириченое представление  %s",NumbToHex(x8,4)); print(str);

}


NumbToHex(num,k)
// num - число, которое требуется привести к шестнадцатириченому представлению
//   k - количество байт в числе
{
  string ts="";

  // идем по байтам числа
  for (int i=0; i<k; i++)
  {
     uc = num >> (8*i);
     ts = ByteToHex(uc) + " " + ts;
  }

  FreeSpaceString(ts,3,"");

  return ts;
}


ByteToHex(n)
// функция возвращает шестнадцатириченое представление байта
{
  string ts="";
  string ts1="";
  string ts2="";

  sprintf(str,"%s",ByteToBin(n));

  for (int i=0; i<4; i++) str1[i]=str[i]; str1[4]=0;
  for (int i=0; i<4; i++) str2[i]=str[i+5]; str2[4]=0;

  if (!strcmp(str1,"0000")) ts1="0";  if (!strcmp(str2,"0000")) ts2="0";
  if (!strcmp(str1,"0001")) ts1="1";  if (!strcmp(str2,"0001")) ts2="1";
  if (!strcmp(str1,"0010")) ts1="2";  if (!strcmp(str2,"0010")) ts2="2";
  if (!strcmp(str1,"0011")) ts1="3";  if (!strcmp(str2,"0011")) ts2="3";
  if (!strcmp(str1,"0100")) ts1="4";  if (!strcmp(str2,"0100")) ts2="4";
  if (!strcmp(str1,"0101")) ts1="5";  if (!strcmp(str2,"0101")) ts2="5";
  if (!strcmp(str1,"0110")) ts1="6";  if (!strcmp(str2,"0110")) ts2="6";
  if (!strcmp(str1,"0111")) ts1="7";  if (!strcmp(str2,"0111")) ts2="7";
  if (!strcmp(str1,"1000")) ts1="8";  if (!strcmp(str2,"1000")) ts2="8";
  if (!strcmp(str1,"1001")) ts1="9";  if (!strcmp(str2,"1001")) ts2="9";
  if (!strcmp(str1,"1010")) ts1="A";  if (!strcmp(str2,"1010")) ts2="A";
  if (!strcmp(str1,"1011")) ts1="B";  if (!strcmp(str2,"1011")) ts2="B";
  if (!strcmp(str1,"1100")) ts1="C";  if (!strcmp(str2,"1100")) ts2="C";
  if (!strcmp(str1,"1101")) ts1="D";  if (!strcmp(str2,"1101")) ts2="D";
  if (!strcmp(str1,"1110")) ts1="E";  if (!strcmp(str2,"1110")) ts2="E";
  if (!strcmp(str1,"1111")) ts1="F";  if (!strcmp(str2,"1111")) ts2="F";

  return ts1 + ts2;
}


NumbToBin(num,k)
// num - число, которое требуется привести к двоичному представлению
//   k - количество байт в числе
{
  string ts="";

  // идем по байтам числа
  for (int i=0; i<k; i++)
  {
     uc = num >> (8*i);
     ts = ByteToBin(uc) + " " + ts;
  }

  FreeSpaceString(ts,3,"");

  return ts;
}


ByteToBin(n)
// функция возвращает двоичное представление байта
{
  unsigned short dg[8];
  string ts="";
  
  dg[0]=1;
  dg[1]=2;
  dg[2]=4;
  dg[3]=8;
  dg[4]=16;
  dg[5]=32;
  dg[6]=64;
  dg[7]=128;

  // идем по разрядам
  for (int i=0; i<8; i++)
  {
    uc = n & dg[i];
    uc >>= i;
    ts = static_cast_to_string(uc) + ts;
    if (i==3) ts = ":" + ts;
  }

  return ts;
}
