Chunk decoden?

CoolPeter

Grünschnabel
Hallo,
ich bin auf der suche nach einer Function um einen Chunk zu decoden.
In VisualBasic habe ich eine Funktion gefunden, aber kann diese nicht richtig für C# umschreiben...

Code:
Public Function DecodeChunkedMessage(ByVal strMessage As String) As String
    '
    Dim lngPosA         As Long
    Dim lngPosB         As Long
    Dim intOctetsToRead As Integer
    Dim strTempBuffer   As String
    '
    Const CRLF_LENGHT = 2
    '
    lngPosA = InStr(1, strMessage, vbCrLf)
    intOctetsToRead = Val("&H" & Left(strMessage, lngPosA - 1))
    '
    Do Until intOctetsToRead = 0
        strTempBuffer = strTempBuffer & Mid(strMessage, lngPosA + CRLF_LENGHT, intOctetsToRead)
        lngPosB = lngPosA + CRLF_LENGHT + intOctetsToRead + CRLF_LENGHT
        lngPosA = InStr(lngPosB, strMessage, vbCrLf)
        intOctetsToRead = Val("&H" & Mid(strMessage, lngPosB, lngPosA - lngPosB))
    Loop
    '
    DecodeChunkedMessage = strTempBuffer
    '
End Function

Das ist die VB Funktion ...
Leider weiß ich nicht, wodurch ich die Val() Funktion ersetzen kann :(

Kann mir da einer weiterhelfen?
Das ganze soll dazu dienen die ausgabe von einem Webserver zu decoden.
 
Na ja, die Methode Val() in VB liefert Dir alle numerischen Werte aus einem String. Eine eigens dafür entworfene Methode auf C#.NET kenn ich jetzt nicht. Aber mit Hilfe von regulären Ausdrücken (Regular Expressions) kannst Du alle Zahlen aus einem String rausfiltern.
Eine weitere Möglichkeit wäre jeden Char mit Hilfe einer foreach-Schleife aus dem String auf IsNumeric zu prüfen und dann entsprechend bei true weg zu schreiben.
 
Ich glaube, dass damit eine Hex- in eine Dezimalzahl umgewandelt wird.
Weil bei mir kommt folgendes raus:

intOctetsToRead = Val("&H" & "e ")

intOctetsToRead ist dann gleich 14.
Habs mal mit Convert.ToDecimal("&H" + "e ") probiert,
aber leider erhalte ich nur eine Fehlermeldung

Habe auch eine Funktion in PHP gefunden, vielleicht kann ja jemand damit was anfangen.

Code:
	function decodeChunked($buffer){
		$length = 0;
		$new = '';
		$chunkend = strpos($buffer,"\r\n") + 2;
		$temp = substr($buffer,0,$chunkend);
		$chunk_size = hexdec( trim($temp) );
		$chunkstart = $chunkend;
		while ($chunk_size > 0) {
			$chunkend = strpos( $buffer, "\r\n", $chunkstart + $chunk_size);
		  	if ($chunkend == FALSE) {
		  	    $chunk = substr($buffer,$chunkstart);
		    	$new .= $chunk;
		  	    $length += strlen($chunk);
		  	    break;
			}
		  	$chunk = substr($buffer,$chunkstart,$chunkend-$chunkstart);
		  	$new .= $chunk;
		  	$length += strlen($chunk);
		  	$chunkstart = $chunkend + 2;
		  	$chunkend = strpos($buffer,"\r\n",$chunkstart)+2;
			if($chunkend == FALSE) break;
			$temp = substr($buffer,$chunkstart,$chunkend-$chunkstart);
			$chunk_size = hexdec( trim($temp) );
			$chunkstart = $chunkend;
		}
		return $new;
	}
 
Original geschrieben von CoolPeter
Ich glaube, dass damit eine Hex- in eine Dezimalzahl umgewandelt wird.
Weil bei mir kommt folgendes raus:

intOctetsToRead = Val("&H" & "e ")

intOctetsToRead ist dann gleich 14.

Das ist leider falsch!

Starte mal Dein Visual Basic 6 und führe den folgenden Code aus:
Code:
Private Sub Form_Load()
   MsgBox Val("1234_val_1234")

   MsgBox Val("&H1234_val_1234")
End Sub
Als erstes Ergebnis erhältst Du eine MessageBox mit der Ausgabe 1234 und in der zweiten steht dann 4660. Wenn Du in den Windows Taschenrechner nun DEZ 4660 eintippst und auf HEX konvertierst, dann erhältst Du HEX 1234.

Val() liest die numerischen Werte bis zum ersten nichtnumerischen Zeichen aus und gibt diese zurück. In Visual Basic werden Hexzahlen mit &H eingeleitet. Es signalisiert dem Compiler, das die nachfolgende Zahl hexdezimalen Ursprungs ist. Val() selbst konvertiert nix.
 
Zuletzt bearbeitet:
Was die Funktion macht, weiß ich ja mittlerweile ...
Hab mir dazu mal die passende msdn Seite angeguggt.

Ich dachte ja nur, weil in der PHP Funktion ja die hexdec() Funktion benutzt wird.
Und diese konvertiert ja eine Hexadezimal zu dezimal...

VB: Val("&H89c") = 2204
PHP: hexdec("&H89c") = 2204

VB: Val("&H7bdc") = 31708
PHP: hexdec("&H7bdc") = 31708

Weiß du, wie ich das ganze wie in der PHP Funktion hinbekommen kann?
Gibt es dafür schon eine Funktion um eine Hexadezimal zur dezimal zu konvertieren?
 
Also erstens muss ich mal darauf hinweisen, dass wir hier im C#.NET-Forum sind und hier VB und PHP eigentlich nix zu suchen hat, und zweitens gibts dazu die Seite www.php.net. :)
 
Original geschrieben von Saber
Na ja, die Methode Val() in VB liefert Dir alle numerischen Werte aus einem String. Eine eigens dafür entworfene Methode auf C#.NET kenn ich jetzt nicht. Aber mit Hilfe von regulären Ausdrücken (Regular Expressions) kannst Du alle Zahlen aus einem String rausfiltern.
Eine weitere Möglichkeit wäre jeden Char mit Hilfe einer foreach-Schleife aus dem String auf IsNumeric zu prüfen und dann entsprechend bei true weg zu schreiben.
 
Manmanman .... Mir geht es doch net nur um die Val() :)
Wollte die ChunkedMessage Funktion von VB für C# übersetzen
Naja, habe meine Funktion nun auch fertig ...
Hier mal für die, die sowas gebrauchen könnten :D

Code:
public static string DecodeChunked(string Data)
{
	int intPosA = Data.IndexOf("\r\n");
	int intPosB;
	string strTempBuffer;
	int intOctetsToRead = HexToInt(Data.Substring(0, intPosA).Trim());
	while(intOctetsToRead > 0)
	{
		strTempBuffer += Data.Substring(intPosA + 2, intOctetsToRead);
		intPosB = intPosA + 2 + intOctetsToRead + 2;
		intPosA = Data.IndexOf("\r\n", intPosB);
		intOctetsToRead = HexToInt(Data.Substring(intPosB, intPosA - intPosB));
	}
	return strTempBuffer;
}

public static int HexToInt(String hexstr)
{
	int counter,hexint;
	char[] hexarr;
	hexint=0;
	hexstr=hexstr.ToUpper();
	hexarr=hexstr.ToCharArray();
	for (counter=hexarr.Length-1;counter>=0;counter--)
	{
		if ((hexarr[counter]>='0') && (hexarr[counter]<='9'))
		{
			hexint+=(hexarr[counter]-48)*((int)(Math.Pow(16,hexarr.Length-1-counter)));
		}
		else
		{
			if ((hexarr[counter]>='A') && (hexarr[counter]<='F'))
			{
				hexint+=(hexarr[counter]-55)*((int)(Math.Pow(16,hexarr.Length-1-counter)));
			}
			else
			{
				hexint=0;
				break;
			}
		}
	}
	return hexint;
}
 
Also aus HEX-Zahlen kannst Du auch mit einem einzigen Befehl Dezimalzahlen machen:
Code:
int dez = Convert.ToInt32("1E", 16);
In der Variable "dez" steht im Anschluss der Wert "30" drinnen. Bei einem Convert-Aufruf kannst Du nämlich auch die Basis (hier "16" für HEX) mitübergeben.

Aber nur mal so als Frage: wolltest Du jetzt HEX-Zahlen nach dezimal konvertieren oder den Val()-Befehel aus VB nachbauen, denn Val() konvertiert keine HEX-Zahlen, sondern sucht nach Zahlen in Strings! ;)
 

Neue Beiträge

Zurück