Equivalent StrConv VB

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

Neo_Fr

23 réponses

BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 17
20 avril 2007 à 19:38
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++
3
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 17
20 avril 2007 à 19:54
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++
3
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
20 avril 2007 à 20:08
Ok merci ca marche nikel encore bravo

Neo_Fr
3
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 17
20 avril 2007 à 21:20
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++
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
20 avril 2007 à 18:29
Oui, a condition de l'écrire

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

Neo_Fr
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
20 avril 2007 à 18:33
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)

_____________________________________
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
20 avril 2007 à 18:36
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
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 17
20 avril 2007 à 18:55
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++
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
20 avril 2007 à 18:56
Comment faire alors pour convertir une chaine de caracteres en binaires?

Neo_Fr
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 17
20 avril 2007 à 19:04
Veut dire quoi "traduire en binaire" ???
Donne un exemple.

ciao...
BruNews, MVP VC++
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
20 avril 2007 à 19:07
Hello -> 0100100001100101011011000110110001101111


Neo_Fr
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 17
20 avril 2007 à 19:14
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++
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 17
20 avril 2007 à 19:16
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++
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 17
20 avril 2007 à 19:19
reOUPS, version traitant du 'int', bon exercice tu refais version traitant char.

ciao...
BruNews, MVP VC++
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
20 avril 2007 à 19:51
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
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
20 avril 2007 à 20:48
J'allais oublier comment on fait pour faire le contraire?

Neo_Fr
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 17
20 avril 2007 à 20:53
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++
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
20 avril 2007 à 20:54
Je connais absolument rien en asm et je commence tout juste le c.... mais bon je vais essayer

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

Neo_Fr
0
Rejoignez-nous