Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2020, 19:46   #1
good_luck7777
 
Регистрация: 04.03.2020
Сообщений: 4
По умолчанию Перевод в ШЕСНАДЦАТЕРИЧНУЮ систему

Всем привет!

Подскажите существует ли в WINAPI функция для перевода из десятичной в шестнадцатеричную систему счисления ?
good_luck7777 вне форума Ответить с цитированием
Старый 05.03.2020, 08:13   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Код:
WCHAR buf[16];
wsprintf(buf,L"%x",255);
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 05.03.2020, 08:32   #3
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

sprintf_s

спецификатор формата "%X"
Алексей1153 вне форума Ответить с цитированием
Старый 09.03.2020, 19:48   #4
good_luck7777
 
Регистрация: 04.03.2020
Сообщений: 4
По умолчанию

Народ, подскажите еще как вызвать эту функцию в VB6 ?
good_luck7777 вне форума Ответить с цитированием
Старый 10.03.2020, 08:43   #5
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

good_luck7777, там свои функции
https://docs.microsoft.com/ru-ru/off...p/hex-function
Алексей1153 вне форума Ответить с цитированием
Старый 10.03.2020, 15:58   #6
good_luck7777
 
Регистрация: 04.03.2020
Сообщений: 4
По умолчанию

Спасибо, функция Hex() работает,
у меня проблема с переводом больших чисел
например 04606203097180, т.е. 14 разрядов.

Число большое.. в VB6 нет такого типа

Я думал меня спасёт функция WINAPI

Подскажите как решить проблему ?
good_luck7777 вне форума Ответить с цитированием
Старый 10.03.2020, 21:34   #7
kvitaliy
Участник клуба
 
Регистрация: 17.05.2011
Сообщений: 1,660
По умолчанию

Цитата:
Сообщение от good_luck7777 Посмотреть сообщение
Подскажите как решить проблему ?
Хитрый алгоритм:
Код:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Function Dec2Hex(ByVal strDec As Variant) As String

Dim mybyte(0 To 19) As Byte
Dim lp As Long

CopyMemory mybyte(0), ByVal VarPtr(CDec(strDec)), 16

For lp = 7 To 4 Step -1
    mybyte(12 + lp) = mybyte(lp)
Next

For lp = 19 To 8 Step -1
    If (Not Len(Dec2Hex) And mybyte(lp) <> 0) Or Len(Dec2Hex) Then
        'Dec2Hex = Dec2Hex & Format(hex(mybyte(lp)), IIf(Len(Dec2Hex), "00", "0"))
        Dec2Hex = Dec2Hex & IIf(Len(Dec2Hex), Right$("0" & Hex(mybyte(lp)), 2), Hex(mybyte(lp)))
    End If
Next

End Function

Private Sub Command1_Click()
MsgBox Dec2Hex(22341234554321#)
End Sub
kvitaliy вне форума Ответить с цитированием
Старый 25.08.2021, 19:40   #8
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

А зачем на каждый чих специальная функция? Да ещё и апишная.
Код:
if (x<0)
{
 buffer=-x;
 p=hex+1;
 hex[0]='-';
}
else
{
 buffer=x;
 p=hex;
}
do
{
 switch (buffer%16)
 {
  case 0: *p='0';
  break;
  case 1: *p='1';
  break;
  case 2: *p='2';
  break;
  case 3: *p='3';
  break;
  case 4: *p='4';
  break;
  case 5: *p='5';
  break;
  case 6: *p='6';
  break;
  case 7: *p='7';
  break;
  case 8: *p='8';
  break;
  case 9: *p='9';
  break;
  case 10: *p='A';
  break;
  case 11: *p='B';
  break;
  case 12: *p='C';
  break;
  case 13: *p='D';
  break;
  case 14: *p='E';
  break;
  case 15: *p='F';
  break;
 }
 buffer/=16;
} while (buffer!=0);
*p='\0';
Код:
for (p=hex, buffer=x, i=sizeof(x)*2-1; i>=0; --i, buffer/=16)
{
 switch (buffer%16)
 {
  case 0: hex[i]='0';
  break;
  case 1: hex[i]='1';
  break;
  case 2: hex[i]='2';
  break;
  case 3: hex[i]='3';
  break;
  case 4: hex[i]='4';
  break;
  case 5: hex[i]='5';
  break;
  case 6: hex[i]='6';
  break;
  case 7: hex[i]='7';
  break;
  case 8: hex[i]='8';
  break;
  case 9: hex[i]='9';
  break;
  case 10: hex[i]='A';
  break;
  case 11: hex[i]='B';
  break;
  case 12: hex[i]='C';
  break;
  case 13: hex[i]='D';
  break;
  case 14: hex[i]='E';
  break;
  case 15: hex[i]='F';
  break;
 }
}
Hex[sizeof(x)]='\0';
Код:
hex.clear();
if (x<0)
{
 buffer=-x;
}
else
{
 buffer=x;
}
do
{
 switch (buffer%16)
 {
  case 0: hex="0"+hex;
  break;
  case 1: hex="1"+hex;
  break;
  case 2: hex="2"+hex;
  break;
  case 3: hex="3"+hex;
  break;
  case 4: hex="4"+hex;
  break;
  case 5: hex="5"+hex;
  break;
  case 6: hex="6"+hex;
  break;
  case 7: hex="7"+hex;
  break;
  case 8: hex="8"+hex;
  break;
  case 9: hex="9"+hex;
  break;
  case 10: hex="A"+hex;
  break;
  case 11: hex="B"+hex;
  break;
  case 12: hex="C"+hex;
  break;
  case 13: hex="D"+hex;
  break;
  case 14: hex="E"+hex;
  break;
  case 15: hex="F"+hex;
  break;
 }
}while (buffer!=0); 
if (x<0)
{
 hex="-"+hex;
}
Код:
hex.clear();
if (x<0)
{
 buffer=-x;
}
else
{
 buffer=x;
}
for (i=sizeof(x)*2; i>0; --i, buffer/=16)
{
 switch (buffer%16)
 {
  case 0: hex="0"+hex;
  break;
  case 1: hex="1"+hex;
  break;
  case 2: hex="2"+hex;
  break;
  case 3: hex="3"+hex;
  break;
  case 4: hex="4"+hex;
  break;
  case 5: hex="5"+hex;
  break;
  case 6: hex="6"+hex;
  break;
  case 7: hex="7"+hex;
  break;
  case 8: hex="8"+hex;
  break;
  case 9: hex="9"+hex;
  break;
  case 10: hex="A"+hex;
  break;
  case 11: hex="B"+hex;
  break;
  case 12: hex="C"+hex;
  break;
  case 13: hex="D"+hex;
  break;
  case 14: hex="E"+hex;
  break;
  case 15: hex="F"+hex;
  break;
 }
}
if (x<0)
{
 hex="-"+hex;
}
Можно, особо не напрягаясь, накидать перевод в нуль-терминальную с учётом знака, можно ставить явный плюс перед положительными, можно, особо не напрягаясь, прописать пробелы вместо ведущих нолей в нуль-терминальной строке, можно, особо не напрягаясь, прописать пробелы вместо ведущих нолей в std::string, можно юзать другие цифры. Например, 16 кириллических букв по порядку. Даже добавлять в итоговую строку не отдельные символы, а названия цифр, тогда, например, 12307 переведётся в строку "три ноль один три". Если заранее известно, что один и тот же перевод вот в этой вот софтине будет вызываться из разных мест, то можно и самому оформить его функцией. Но это тот случай, когда свой велосипед проще инструкции к стандартному заводу (если бы он был). Кстати, а где Вы возьмёте десятичную форму? И как она у Вас представлена? Сначала переведите из неё во внутреннее представление, а уже оттуда в шестнадцатеричную. Кстати, если заранее известно, что комп двоичный, то можно и грязный хак:
Код:
for (p=(((uint8_t*)(&x))+sizeof(x)-1), ((hex.clear)()); p>=((uint8_t*)(&x)); --p)
{
  switch ((*p)&15)
  {
   case 0: hex=("0"+hex);
   break;
   case 1: hex=("1"+hex);
   break;
   case 2: hex=("2"+hex);
   break;
   case 3: hex=("3"+hex);
   break;
   case 4: hex=("4"+hex);
   break;
   case 5: hex=("5"+hex);
   break;
   case 6: hex=("6"+hex);
   break;
   case 7: hex=("7"+hex);
   break;
   case 8: hex=("8"+hex);
   break;
   case 9: hex=("9"+hex);
   break;
   case 10: hex=("A"+hex);
   break;
   case 11: hex=("B"+hex);
   break;
   case 12: hex=("C"+hex);
   break;
   case 13: hex=("D"+hex);
   break;
   case 14: hex=("E"+hex);
   break;
   case 15: hex=("F"+hex);
   break;
  }
  switch (((*p)&240)>>8)
  {
   case 0: hex=("0"+hex);
   break;
   case 1: hex=("1"+hex);
   break;
   case 2: hex=("2"+hex);
   break;
   case 3: hex=("3"+hex);
   break;
   case 4: hex=("4"+hex);
   break;
   case 5: hex=("5"+hex);
   break;
   case 6: hex=("6"+hex);
   break;
   case 7: hex=("7"+hex);
   break;
   case 8: hex=("8"+hex);
   break;
   case 9: hex=("9"+hex);
   break;
   case 10: hex=("A"+hex);
   break;
   case 11: hex=("B"+hex);
   break;
   case 12: hex=("C"+hex);
   break;
   case 13: hex=("D"+hex);
   break;
   case 14: hex=("E"+hex);
   break;
   case 15: hex=("F"+hex);
   break;
  }
 }
}
. А можно и сразу парами цифр.

Последний раз редактировалось taras-proger77; 26.08.2021 в 15:38.
taras-proger77 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод программы с 32 бит на 64 бит систему andreyxdd Общие вопросы Delphi 3 19.07.2017 11:04
Перевод из 3 в 16 систему счисления artem_alexeev Паскаль, Turbo Pascal, PascalABC.NET 2 19.02.2017 09:29
Перевод в 256-ти ричную систему MooNDeaR Помощь студентам 12 18.10.2013 23:56
перевод в двоичн. систему terminadoor Помощь студентам 3 22.12.2008 10:11
перевод из 4-ной в 3-ную систему счисления Mike07 Помощь студентам 1 07.10.2007 18:53