Equivalent StrConv VB

Résolu
Signaler
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
-
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
-
Existe - t'il une fonction en c pour convertir une string en bits comme la fonction StrConv en VB?

Neo_Fr

23 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Bon allez, pour me faire pardonner les "OUPS" à répétition.

#define MEMDISPO    (MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN)


char szappname[] = "szToBin";


char* ByteToBits(BYTE bt, char *pdst)
{
  int i = 7;
  do {
    *pdst++ = (bt & 0x80) ? 49: 48;
    bt <<= 1;
  } while(i--);
  *pdst = 0;
  return pdst;
}


void __stdcall TestToBin()
{
  char *pmem, *c, *d;
  pmem = (char*) VirtualAlloc(0, strlen(szappname) * 8 + 1, MEMDISPO, PAGE_READWRITE);
  // MEMOIRE POUR CONVERT szappname
  if(!pmem) return;
  c = szappname;
  d = pmem;
  while(*c) {
    d = ByteToBits((BYTE) *c, d);
    c++;
  }
  MessageBox(0, pmem, szappname, 0);
  VirtualFree(pmem, 0, MEM_RELEASE);
}


#pragma comment(linker, "/entry:myWinMain")
__declspec(naked) void __stdcall myWinMain()
{
  __asm {
    call    TestToBin
    push    0
    call    dword ptr ExitProcess
  }
}

ciao...
BruNews, MVP VC++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Remets un WinMain, rien de bien sorcier.
Je fais mes projets avec mon prog de templates, voila pourquoi il est ainsi.

Fais un projet Win32 GUI (non console), propriété VIDE (pas de stdafx et autres inutilités).
Tu fais un fichier c du meme nom que le projet et tu colles ce qu'il y a plus haut.
Compile direct en RELEASE.

ciao...
BruNews, MVP VC++
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Ok merci ca marche nikel encore bravo

Neo_Fr
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Recolle tout dans le module C précédent et recompile en RELEASE.


#define _WIN32_WINNT 0x0600
#define _WIN32_IE 0x0700
#include <windows.h>


#define MEMDISPO    (MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN)


char szappname[] = "szToBin";


char* __stdcall ByteToBits(BYTE bt, char *pdst)
{
  int i = 7;
  do {
    *pdst++ = (bt & 0x80) ? 49: 48;
    bt <<= 1;
  } while(i--);
  *pdst = 0;
  return pdst;
}


BYTE __stdcall Bin8ToByte(char *psz)
{
  int i = 8;
  BYTE bt, bRet = 0;
  do {
    bt = *psz++;
    bRet <<= 1;
    bt -= 48;
    if(bt > 1) return 0;
    bRet |= bt;
  } while(--i);
  return bRet;
}


void __stdcall TestToBin()
{
  char *pmem, *c, *d;
  pmem = (char*) VirtualAlloc(0, strlen(szappname) * 8 + 1, MEMDISPO, PAGE_READWRITE);
  // MEMOIRE POUR CONVERT szappname
  if(!pmem) return;
  c = szappname;
  d = pmem;
  while(*c) {
    d = ByteToBits((BYTE) *c, d);
    c++;
  }
  MessageBox(0, pmem, szappname, 0);
 
  // INVERSE, REECRITURE DIRECT SUR pmem DEPUIS CHAINE pmem
  c = pmem;
  d = pmem;
  while(*d = Bin8ToByte(c)) {d++; c+= 8;}
  MessageBox(0, pmem, szappname, 0);
 
  VirtualFree(pmem, 0, MEM_RELEASE);
}


#pragma comment(linker, "/entry:myWinMain")
__declspec(naked) void __stdcall myWinMain()
{
  __asm {
    call    TestToBin
    push    0
    call    dword ptr ExitProcess
  }
}

ciao...
BruNews, MVP VC++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
Oui, a condition de l'écrire

_____________________________________
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Tu sait pas ou je peux trouver un petit exemple stp?

Neo_Fr
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
Pourquoi ne pas essayer de l'écrire toi même?
Donne au moins déja la signature de la fonction que tu recherches (paramètres, types de retour)

_____________________________________
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
j'aimerais bien faire une fonction de ce genre:

void ToByte(char* Input, char* Output);
void ToAscii(char* Input, char* Output);

Mais apres je ne sait absolument pas par quoi commencer.
Neo_Fr
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
ToAscii() n'a aucun sens en natif puisque tu accèdes direct au stockage mémoire donc à la valeur ASCII de l'octet.
ToByte() aucune idée de ce que devrait faire mais ça doit être du même ordre.

Quand on vient de VB faut commencer par oublier tout ce qu'on a cru savoir, faux concepts en tout genre. Tu dois débuter en te disant que tu ne sais rien et surtout ne jamais te référer à ce que tu as vu avant, pas évident mais c'est le seul moyen d'y arriver.

ciao...
BruNews, MVP VC++
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Comment faire alors pour convertir une chaine de caracteres en binaires?

Neo_Fr
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Veut dire quoi "traduire en binaire" ???
Donne un exemple.

ciao...
BruNews, MVP VC++
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Hello -> 0100100001100101011011000110110001101111


Neo_Fr
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
char* __stdcall IntToBin(int n, char *psz)
{
  if(!n) *psz++ = 48;
  else {
    while(!(n & 0x80000000)) n <<= 1;
    while(n) {
      *psz++ = (n & 0x80000000) ? 49: 48;
      n <<= 1;
    }
  }
  *psz = 0; return psz;
}

retourne pointeur sur null final, permet chainage direct.
Suffira d'appeler en boucle avec pointeur parcourant ta chaine.

ciao...
BruNews, MVP VC++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
OUPS je t'ai mis version n'affichant pas les zéros de gauche.
Devrait suffire d'invalider le premier while().

ciao...
BruNews, MVP VC++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
reOUPS, version traitant du 'int', bon exercice tu refais version traitant char.

ciao...
BruNews, MVP VC++
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Merci beaucoup, mais l'asm c vraiment obligé juste pour apeller une fonction?
J'arive mm pas a compiler sous VC2003
LIBCD.lib(crt0.obj) : error LNK2019: unresolved external symbol _main referenced in function _mainCRTStartup

Debug/essai.exe : fatal error LNK1120: 1 unresolved externals

Neo_Fr
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
J'allais oublier comment on fait pour faire le contraire?

Neo_Fr
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Là t'as le copier coller, à remettre en C si ça te dit:

__declspec(naked) int __fastcall strBinToInt(char *psz)
{ // ECX = psz, EDX autre param mais niet ici
  __asm {
    xor     eax, eax
next:
    mov     dl, byte ptr[ecx]
    sub     dl, 48
    jc      short tointExit
    cmp     dl, 1
    ja      short tointExit
    shl     eax, 1
    inc     ecx
    or      al, dl
    jmp     short next
tointExit:
    ret     0
  }
}

essaie conversion en C, je t'aide si tu proposes un bon début de travail.

ciao...
BruNews, MVP VC++
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Je connais absolument rien en asm et je commence tout juste le c.... mais bon je vais essayer

Neo_Fr
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
eax c'est un registre, maus qu'est ce qu'il contient?

Neo_Fr