Wątek zablokowany 2013-07-03 08:31 przez Rev.

[C#]Tajemnicza funkcja

0

Witam czy potrafi ktos wytlumaczyc co robi ponizsza funkcja i pomoc przepisac ja dla C#

QString FDigest(QString input)
{
	if(input.size() != 32) return "";

	int idx[] = {0xe, 0x3, 0x6, 0x8, 0x2},
		mul[] = {2, 2, 5, 4, 3},
		add[] = {0x0, 0xd, 0x10, 0xb, 0x5},
		a, m, i, t, v;

	QString b;
	char tmp[2] = { 0, 0 };

	for(int j = 0; j <= 4; j++)
	{
		a = add[j];
		m = mul[j];
		i = idx[j];

		tmp[0] = input[i].toAscii();
		t = a + (int)(strtol(tmp, NULL, 16));
		v = (int)(strtol(input.mid(t, 2).toLocal8Bit(), NULL, 16));

		sprintf(tmp, "%x", (v * m) % 0x10);
		b += tmp;
	}

	return b;
}
0

A co to za obiekt QString?

0

To od interfejsu w Qt :)

na wejscie podawana jest suma md5 :)

0

Przerobilem juz tyle

private string fmd5(string input)
        {
            if (input.Length != 32)
            {
                return "";
            }
            else
            {
                int[] idx = { 0xe, 0x3, 0x6, 0x8, 0x2 };
                int[] mul = { 2, 2, 5, 4, 3 };
                int[] add = { 0x0, 0xd, 0x10, 0xb, 0x5 };
                int a, m, i, t, v;

                string b;

                char[] tmp = {'0','0'};

                for (int j = 0; j <= 4; j++)
                {
                    a = add[j];
                    m = mul[j];
                    i = idx[j];

                   //to zostalo
                }

                return b;
            }
        }

zostalo to

                tmp[0] = input[i].toAscii();
                t = a + (int)(strtol(tmp, NULL, 16));
                v = (int)(strtol(input.mid(t, 2).toLocal8Bit(), NULL, 16));

                sprintf(tmp, "%x", (v * m) % 0x10);
                b += tmp;
0

long int strtol ( const char * str, char ** endptr, int base );
Convert string to long integer

wiec to:
tmp[0] = input[i].toAscii();
t = a + (int)(strtol(tmp, NULL, 16));
wg mnie przerabia liczby szesnastkowe do dziesietnych (i do zmiennet t sumuje z a)
jest jeszcze jeden kwac, skad jest 'i' w input[i].toAscii();
nie zauwazylem gdzie jest przypisywana wartosc, bo petla for jest po j

wracajac, w c# przeksztalcenie z string do long to: Convert.ToInt64("value", 16)
do konwertowania ascii popatrz na ASCIIEncoding

0

i to int do ktorego wartosc jest przypisywana w petli

i = idx[j];
0

cholernie ciezka sprawa, szkoda ze nie ma komentarzy przy kodzie :(

0

na moje oko:

string FDigest(string input)
{
    if(input.Length != 32) return string.Empty;

    int[] idx = {0xe, 0x3, 0x6, 0x8, 0x2},
        mul = {2, 2, 5, 4, 3},
        add = {0x0, 0xd, 0x10, 0xb, 0x5};

    StringBuilder b = new StringBuilder();
    string tmp;
    for(int j = 0; j <= 4; ++j)
    {
        int a = add[j];
        int m = mul[j];
        int i = idx[j];

        int t = a + Convert.ToInt32(input.Substring(i,1), 16);
        
        int v = Convert.ToInt32(input.Substring(t, 2), 16);

        tmp = Convert.ToString((v * m) % 16, 16);

        b.Append( tmp );
    }

    return b.ToString();
}

pominalem wywolania .ToAscii oraz .toLocal8Bit, poniewaz wydaje mi sie ze byly one potrzebne tylko i wylacznie, by ktos mogl korzystac z strol ktory wymaga ascii, w .Net zas i tak wszystko chodzi w unicode.
staralem sie zachowac jak najwiecej z oryginalu, zebys widzial co jest czym
kod NIE BYL testowany

0

nie wiem co robi input[i].toAscii();
zwraca tablice 2 char?
czyli w jakim kodowaniu jest input?

jak bedziesz wiedzial to luknij na System.Text
np. ASCIIEncoding, UTF8Encoding

uzyj GetBytes, zeby dostac kody ascii

a tak dwa byte to longa mozna przerobic:
var x = Convert.ToInt64(b1[0]);
var y = Convert.ToInt64(b1[1]);

long t1 = (y << 16) + x;

do t1 dodajesz a i to twoje t
v wyznaczasz w podobny sposob

a pozniej z gorki

0
massther napisał(a)

nie wiem co robi input[i].toAscii();
wiec uzyj google i sie zorientuj

var x = Convert.ToInt64(b1[0]);
var y = Convert.ToInt64(b1[1]);
long t1 = (y << 16) + x;
nie ma to jak wywazac otwarte drzwi (ToInt32(string,base)) uzywajac słonia (Int64)

0
quetzalcoatl napisał(a)

na moje oko:

string FDigest(string input)
{
    if(input.Length != 32) return string.Empty;

    int[] idx = {0xe, 0x3, 0x6, 0x8, 0x2},
        mul = {2, 2, 5, 4, 3},
        add = {0x0, 0xd, 0x10, 0xb, 0x5};

    StringBuilder b = new StringBuilder();
    string tmp;
    for(int j = 0; j <= 4; ++j)
    {
        int a = add[j];
        int m = mul[j];
        int i = idx[j];

        int t = a + Convert.ToInt32(input.Substring(i,1), 16);
        
        int v = Convert.ToInt32(input.Substring(t, 2), 16);

        tmp = Convert.ToString((v * m) % 16, 16);

        b.Append( tmp );
    }

    return b.ToString();
}

pominalem wywolania .ToAscii oraz .toLocal8Bit, poniewaz wydaje mi sie ze byly one potrzebne tylko i wylacznie, by ktos mogl korzystac z strol ktory wymaga ascii, w .Net zas i tak wszystko chodzi w unicode.
staralem sie zachowac jak najwiecej z oryginalu, zebys widzial co jest czym
kod NIE BYL testowany

Dziala super, thx

0

Witam. Odświeżam ten wątek w poszukiwaniu pomocy. Tym razem, chodzi o to, aby ten kod przepisać pod Delphi. Próbowałem sam coś zdziałać i mam coś takiego:

function FDigest(input: string): string;

var
  idx: array [0..4] of integer;
  mul: array [0..4] of integer;
  add: array [0..4] of integer;

var
  v, t, a, m, i, j: Integer;
  b, tmp: String;

begin


idx[0] := $e; mul[0] := 2; add[0] := $0;
idx[1] := $3; mul[1] := 2; add[1] := $d;
idx[2] := $6; mul[2] := 5; add[2] := $10;
idx[3] := $8; mul[3] := 4; add[3] := $b;
idx[4] := $2; mul[4] := 3; add[4] := $5;

Result := '';
if Length(input) <> 32 then Exit;

for j := 0 to 4 do
  begin
    a := add[j];
    m := mul[j];
    i := idx[j];

    t := a + strtoint('$' + copy(input, i, 1));
    v := strtoint('$' + copy(input, t, 2));

    tmp := format('%x', [(v*m) mod 16]); //itoa((v * m) mod 16, 16);
    b := b + tmp;
  end;

  Result := b;

end;

Niestety gdzieś popełniam błąd. Siedzę nad tym już X godzin, myślę, myślę i chyba nic nie wymyślę. Proszę Was o pomoc. Generalnie wiem, że oryginalny kod dla hasha: f42a8693b3792ff81ac494f5dd15b9c3 powinien zwracać ciąg znaków: 2a541, mi natomiast wyłazi ciąg: 00bc9

Pomocy :)

0

Jaki sens jest odpowiadać na temat z 2009 roku oO ?

0

Załóż nowy temat, kontynuowanie w tym nie ma sensownych podstaw.

1 użytkowników online, w tym zalogowanych: 0, gości: 1