Как записать в буфер шестнадцатиричные коды

 
Уважаемые программисты, подскажите как подготовить буфер из текстовой переменной для использования функции wininet.dll InternetWriteFileA(hw, cBuffer, 1024, dwBytesWrite);
для записи строковой переменной в файл на FTP сервере.

Есть функция преобразования символов в шестнадцатиричный код, а вот такого типа переменных в mql нет.

Пробовал буфер типа string, но запись данных в файл не производится, записывается нулевая строка, т.е. получаем пустой файл.

string StrBuffer[16];
//заполняем буфер символами
 
int hURL = InternetConnectA(hInternetSession, .................);                     открываем сессию
int hw=FtpOpenFileA(hURL, "/downloads/orders.txt", 1073741824, 2, 1);    открываем файл по ftp на сервере
bool res_WrF=InternetWriteFileA(hw, StrBuffer, 16, dwBytesWrite);           записываем  файл по ftp на сервер
InternetCloseHandle(hw);
InternetCloseHandle(hInternetSession);






string DecToHex(int n)
  {
   string s = "", c;
   while(n != 0)
     {
      if(n%16 < 10)
          c = CharToStr(n % 16 + '0');
      else 
          c = CharToStr(n % 16 + 'A'-10);
      s = c + s;
      n = n / 16;
     }
   return(s);
  }

Как можно получить буфер с шестнадцатиричными значениями? Или может еще как то решить это вопрос.

С уважением
 
 
В MQL тип string имеет внутреннее представление в виде 8 байт, int - 4 байта, а в буфер надо пометить код символа в шестнадцатиричном виде и в одном байте.
Из МТ можно только код символа представить целым типом как 0x53 (символ "S"), 0x0D перевод строки ("\n")- но вот вопрос как из строковой переменной получить такое представление.

Функция приведенная выше дает шестнадцатиричный код, но в виде строковой переменной, а надо в int.
cBuffer[0]=DecToHex(StringGetChar("E",0)); получим 45.

Добавив в функции DecToHex(int smbl) одну строку s="0x"+s; получим то что надо 0x45, но опять же тип string, а нужен int для того чтобы провести операции сдвига.

Вот код, как в ручном варианте удалось заполнить буфер и корректно записать файл по ftp на сервер.

   
   int cBuffer[64];
   cBuffer[0]=0x53+(0x41<<8)+(0x0D<<16)+(0x0A<<24);
   cBuffer[1]=0x54+(0x45<<8)+(0x53<<16)+(0x54<<24);
   cBuffer[2]=0x0D+(0x0A<<8)+(0x54<<16)+(0x45<<24);
   cBuffer[3]=0x53+(0x54<<8)+(0x0D<<16)+(0x0A<<24);
   int hw=FtpOpenFileA(hwURL, FileName, 1073741824, 2, 1);
   bool res_WrF=InternetWriteFile(hw, cBuffer, 64, dwBytesWrite);
В фал записывается

SA
TEST
TEST

Т.е. в одну ячейку буфера пишется со сдвигом четыре символа. Тогда получается как в винде, на один символ один байт.
Вопрос остался совсем за малым....:)

Уважаемые программисты подскажите пожалуйста, наверняка вопрос (решение его) лежит где то на поверхности.

C уважением
 
(код сивола 1)+(код символа 2)*256+(код символа 2)*256^2..... что-то типа такого
 
Код символа в МТ от 1 до 256, т.е в десятичной системе, а надо же получить в шестнадцатиричной, но поместить в переменную типа int так как приведено выше
0x53
Может можно использовать какую либо функцию от библиотек винды для получения кода символа в шестнадцатиричной системе из строковой переменной.
Типа int Func(string n) -->> int h=Func("\n"); -->> h=0x0D;
 

С чего вы это взяли?

 
Не понял, что взял?

Что коды символов от 1 до 256? Или что код, например, символа "S" в винде 53 в шестнадцатиричном виде, а в МТ это представлено в десятичной как 0x53.
 
То что вам зачем-то нужны 16-ые коды
 
Если нетрудно, напишите стоку кода размещения в одной ячейке буфера 4 символов, чтобы подставить его в функцию InternetWriteFile().
 
Да, Вы правы, вот такая форма записи прошла. Только перевода строки не произошло.

cBuffer[0]='F'+'G'<<8 +'S'<<16 +'\n'<<24;
 
А что InternetWriteFile строковую переменную не принимает? Тогда в массив int предложенным мной способом и по ссылке его передавать. Не знаю надо пробовать.