XOR двух HEX строк

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by LARSnn, 18 Mar 2012.

  1. LARSnn

    LARSnn New Member

    Joined:
    15 Oct 2010
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Всем привет.
    Имеется следующая ситуация: даны 2 HEX строки вида
    1) 315c4eeaa8b5f8aaf9174145bf43e1784b8fa00dc71d885a804e5ee9fa40b16349c146fb778cdf2d3aff021dfff5b403b5

    2) 34c02ecbbfbafa3ed18510abd11fa724fcda2018a1a8342cf064bbde548b12b07df44ba7191d9606ef4081ffde5ad46a5069d9

    Мне необходимо их проксорить, т.е. S1 XOR S2. Но неожиданно для себя столкнулся с проблемой. А именно, каким образом я могу вогнать эти строки в массив символов char* чтобы потом уже делать какие либо операции??

    Я только начинаю изучать c++ - так что не кричите сильно!) С.Прата уже большую часть прочитал, но ни чего подобного там и близко нет(
     
    #1 LARSnn, 18 Mar 2012
    Last edited: 18 Mar 2012
  2. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    элементарно:
    делаешь массив для замены:
    и делаешь заемну:

    все.
     
    #2 realcoder, 18 Mar 2012
    Last edited: 18 Mar 2012
  3. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Программисты Windows, давно придумали свои велосипеды:
    http://msdn.microsoft.com/en-us/library/bb773451.aspx

    А я делал что-то типа
    Code:
    void ato(unsigned char *str,unsigned char *dst,size_t size,bool por=false)
    {
    #define BYTE(l,h)           (((l)<<4)|((h)&0xFF))
    
    	size_t i=0,j=0;
    	unsigned char byte[1];
    	// преобразуем в строку в число
    	for(i=0;i<size*2;i++)
    	{
    		if(str[i]>0x40){str[i]-=0x57;}else{str[i]-=0x30;}
    	}
    
    
    	// заполняем числами
    	if(por==false){j=size-1;}else{j=0;}
    	for(i=0;i<size*2;i+=2)
    	{
    		byte[0]=BYTE(str[i],str[i+1]);
    		dst[j]=byte[0];
    		if(por==false){j--;}else{j++;}
    	}
    }
    
    P.S: ^ какой не красивый код раньше писал...
     
    _________________________
    #3 Gar|k, 18 Mar 2012
    Last edited: 18 Mar 2012
  4. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Велосипедов больше чем кажется
    http://msdn.microsoft.com/en-us/library/windows/desktop/aa380285%28v=vs.85%29.aspx

    Между тем реализаций в интернете куча, непонятно зачем такое на форуме спрашивать.
    Например:
    http://www.opensource.apple.com/source/OpenSSL/OpenSSL-30/openssl/fips/rand/fips_rngvs.c
    http://code.google.com/p/bintext/source/browse/trunk/hex2bin.c?r=2

    и т.п.
     
    _________________________
  5. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Больной мозг родил это :)
    Code:
    #define BYTE(l,h)           (((l)<<4)|((h)&0xFF))
    int hex2bin(char *hex, char *bin) {
    	char *p=hex;
    	int size=0;
    
    	while(*p) *(p++) -= (*p > 0x40) ? 0x57 : 0x30;
    	do bin[size++] = BYTE( *hex++, *++hex ); while(hex < p);
    
    	return size;
    }
    
     
    _________________________
    #5 Gar|k, 18 Mar 2012
    Last edited: 19 Mar 2012
  6. LARSnn

    LARSnn New Member

    Joined:
    15 Oct 2010
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    0_o всем спасибо, пошел разбираться))
    to Kaimi - ну я ж просил, не кричите, только начинаю изучать с++))