Chaine en hexa (win32)

Soyez le premier à donner votre avis sur cette source.

Vue 7 879 fois - Téléchargée 332 fois

Description

Pour question récurrente sur forum.

char* __fastcall bnStrToHex(char *szsrc, char* szdst);
retourne pointeur sur fin d'écriture pour chainage direct si besoin.

Prêt à l'emploi, il n'y a plus qu'à utiliser.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
14
Date d'inscription
mardi 24 juin 2003
Statut
Membre
Dernière intervention
25 mars 2008

Ha bein oui nickel,
ca marche tres bien ca.

Merci ^^
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
A TESTER mais devrait aller:
__declspec(naked) char* __fastcall bnStrToHex(char *szsrc, char* szdst, DWORD lensrc)
{ // ECX szsrc, EDX szdst, [esp+4] = lensrc
__asm {
mov [esp-4], esi
mov [esp-8], ebx
mov esi, ecx
mov ebx, [esp+4]
fromSRC:
mov al, [esi]
mov cl, al
add edx, 2
and cl, 15
shr al, 4
add cl, 48
add al, 48
cmp cl, 57
jbe short L1
add cl, 7
L1:
cmp al, 57
jbe short L2
add al, 7
L2:
add esi, 1
mov byte ptr[edx-2], al
mov byte ptr[edx-1], cl
sub ebx, 1
jne short fromSRC
strEXIT:
mov byte ptr[edx], 0
mov esi, [esp-4]
mov ebx, [esp-8]
mov eax, edx
ret 4
}
}

ATTENTION que je ne teste pas si lensrc > 0 en entrée.
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Prend la taille du buffer en parametre:

void __stdcall Bin2Hex(BYTE* lpIn, DWORD dwInSize, BYTE* lpOut)
{
static const BYTE HexaTable[16] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 };
DWORD i = (dwInSize-1);
while(1)
{
lpOut[2*i] = HexaTable[(lpIn[i] >> 4) & 0x0F];
lpOut[2*i+1] = HexaTable[(lpIn[i]) & 0x0F];
if(!i--) break;
}
}

Neo_Fr
Messages postés
14
Date d'inscription
mardi 24 juin 2003
Statut
Membre
Dernière intervention
25 mars 2008

Merci, grace à ton exemple j'ai mis en evidence le probleme avec ta methode bnStrToHex.

Le premier exemple provient de ton exemple et fonctionne
//*******************************************************************//
char* szhex = new char[36];
char* buf = new char[100];
bnStrToHex("_Ahryman__40000_", szhex); // 1 SEULE FOIS, SORT 32 OCTETS ICI
delete[] szhex;
delete[] buf;
//*******************************************************************//

Celui-ci est pratiquement identique mis a part le fait que je ne passe pas une chaine constante mais un pointeur contenant ma chaine:
*******************************************************************//
char* szhex = new char[36];
char* bufferCpy = new char[16];
::memcpy( bufferCpy, "__Ahryman_40000_", 16 );
bnStrToHex( bufferCpy, szhex ); // Ici ma chaine n'est pas terminée par '\0' d'ou le crash !!! J'ai donc besoin d'un tableau de taille 17 et d'inserer le caractere de fin de chaine.
delete[] bufferCpy;
delete[] szhex;

Donc finalement pour que cela fonctionne correctement, il faut appeler la methode comme suis en s'assurant que le parametre d'entrée est bien une chaine avec caractere de fin.
//************************************************************************************//
char* szhex = new char[36];
char* bufferCpy = new char[17];
::memcpy( bufferCpy, "_Ahryman__40000_", 17 );
bufferCpy[16] = '\0';
bnStrToHex( bufferCpy, szhex );
delete[] bufferCpy; // ca ne pete plus -_-''
delete[] szhex;

J'ai donc une derniere question à te poser,
mon besoin final est d'avoir la même methode bnStrToHex prenant en plus la taille de la chaine que je veux traiter (plutot que de s'arreter au caracetre de fin de chaine). Dans mon prog bufferCpy pourra contenir en plein milieu ce caractere de fin de chaine, car c'est une valeur sur 16 caracteres generée aleatoirement. Or j'ai besoin de recuperer le code hexa de l'integralité de ces caracteres.

Merci.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
OUPS, c'est

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Medialive\Agent]
"Version"="3.1"
"BBPath"="C:\azerty.bb"
"MedialiveAgent"="C:\azerty.dll"
"BB1"=hex:5F,41,68,72,79,6D,61,6E,5F,5F,34,30,30,30,30,5F
"BB2"=hex:5F,41,68,72,79,6D,61,6E,5F,5F,34,30,30,30,30,5F

qu'on obtient avec code plus haut.
Afficher les 17 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.