MD5-Hash bei Java und C# geben nicht das selbe Ergebnis?

Hallo zusammen,

ich versuche in den letzten Tage mich mit der Entwickleroberfläche der FritzBox auseinander zu setzen. Leider scheitete ich am Session ID Login.

Der Login funktioniert über eine Challenge (String) den mir die FritzBox generiert und dem Passwort der FritzBox. Wenn ich den Login richtig verstanden habe geht er wie folgt:

Schritt 1: Challenge erhalten via fritz.box/login_sid.lua

Schritt 2: Alle Zeichen im Passwort der FritzBox, welche nicht in ISO-8859-1  
           anzeigbar sind (einen CodePoint von über 255 besitzen) mit einem "."  
           ersetzen

Schritt 3: Einen MD5-Hash im Format von 32 Hexzeichen mit Kleinbuchstaben 
           generieren aus dem String %Challenge%-%Passwort% (%Challenge% ist die
           aus dem Schritt 1, %Passwort% ist das Passwort der FritzBox aus dem 
           Schritt 2)

Schritt 4: Das Ergebnis zum Anmelden nutzen: 
           http://fritz.box/login_sid.lua?response=%Challenge%-%Ergebnis% 
           (%Ergebnis% ist der 
           MD5-Hash aus Schritt 3)

So: Was ist nun mein Problem?

Ich möchte diesen MD5-Hash generieren. Ich habe mir bereits Tutorials angeschaut, wie die von baeldung.com und auch einen String als Ergebnis bekommen. Das Problem ist aber, dass der Hash falsch ist.

Also habe ich mir den Beispiel C#-Code auf der FritzBox Webseite angeschaut und ausprobiert. Das Ergebnis ist ein ganz anderer Hash. Wie kommt das zu Stande?

Damit man mich besser versteht, habe ich hier meinen Java Code und den Code aus C#.

Input bei allen:

51cbb71a-Test

Java (Möglichkeit 1): https://pastebin.com/vpzA8mr9 (um Platz zu sparen als Link)

Output:

DigestTest: 3e2a82112b721922d21a2e62e12f02212b02142c12692a82

Java (Möglichkeit 2):

StringBuilder builder = new StringBuilder();
for (byte b : DigestUtils.md5(input)) {
    builder.append(byteToHex(b));
}
System.out.println("BuilderDigest: " + builder.toString());

Output:

BuilderDigest: 3ea811b7192d1ae6e1f021b014c169a8

Java (Möglichkeit 3):

String md5Hex = DigestUtils.md5Hex(input); //API: commons-codec-1.15.jar
System.out.println("Hash: " + md5Hex);

Output:

Hash: 3ea811b7192d1ae6e1f021b014c169a8

C#

static void Main(string[] args) {
  try {
    MD5 md5Hasher = MD5.Create();
    byte[] encoded = Encoding.Unicode.GetBytes("51cbb71a-Test");
    byte[] data = md5Hasher.ComputeHash(encoded);
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < data.Length; i++) {
      builder.Append(data[i].ToString("x2"));
    }
    Console.WriteLine(builder.ToString());
  } catch(IndexOutOfRangeException exception) {
    Console.WriteLine("null");
  }
}

Output:

0e9af10abdb7cd7119a85967272e3bc3

Wieso kommt da was anderes raus und wie kann ich das nun auch in Java umsetzen? (Der C#-Code gibt die richtige Lösung!)

Danke schon einmal im Voraus!

Links die Helfen können:

  • https://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/Session-ID_deutsch_13Nov18.pdf
  • https://www.baeldung.com/java-md5 (etwas alt)
  • https://www.youtube.com/watch?v=hW2s03abGaI
  • https://codedocu.de/...
Computer, programmieren, Java, C Sharp, Encoding, Informatik, Verschlüsselung
Stimmerkennung in C#?

Hallo liebe Community!

Ich habe einen C# Quellcode heruntergeladen. Das fertige Programm sollte ein Speech to Text tool werden. Jedoch zeigt mir Visual Studio zwei Fehler an, welche mich vom compilieren hindern.

Die Fehler lauten:

Severity Code Description Project File Line Suppression State
Error CS8652 The feature 'top-level statements' is currently in Preview and *unsupported*. To use Preview features, use the 'preview' language version. atletik C:\Users\herrb\Documents\aletik_c#\atletik\atletik\Program.cs 5 Active
Severity Code Description Project File Line Suppression State
Error CS0106 The modifier 'private' is not valid for this item atletik C:\Users\herrb\Documents\aletik_c#\atletik\atletik\Program.cs 11 Active

Hier mal der Quellcode:

using System.Speech;
using System.Speech.Recognition;
using System;


SpeechRecognitionEngine recognizer = null;
recognizer = new SpeechRecognitionEngine();
recognizer.SetInputToDefaultAudioDevice();
recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);
recognizer.RecognizeAsync(RecognizeMode.Multiple);


private void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    string text = e.Result.Text;
    Console.WriteLine(text);
}

Hätte jemand vielleicht eine Idee, ich kenne mich noch nicht in C# aus, deshalb frage ich. Eigentlich wollte ich nur dieses Tool und nicht mehr... also nicht mit C# arbeiten usw.

programmieren, C Sharp
Wie erstelle ich in C# Wpf einen Runden ToggleButton?

Ich möchte einen ToggleButten erstellen, der einen runden Rand hat und seine Breite automatisch anpasst.

Mein Code bisher:

Style:

<Style TargetType="ToggleButton" x:Key="favorite_btn">
            <Setter Property="Height" Value="30"/>
            <Setter Property="Width" Value="Auto"/>
            <Setter Property="Background" Value="Red"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="Cursor" Value="Hand"/>
            <Setter Property="Margin" Value="60,0"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Border BorderBrush="{TemplateBinding Background}" BorderThickness="1" CornerRadius="20">
                            <StackPanel Orientation="Horizontal" Background="Red">
                                <Image Height="20" Width="20" Source="{Binding Path=Image}" VerticalAlignment="Center" Margin="5,0,0,0"/>
                                <TextBlock Text="{Binding Path=Text}" Foreground="White" FontSize="20" Margin="5,0" VerticalAlignment="Center" Width="Auto"/>
                            </StackPanel>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

und

<ToggleButton DockPanel.Dock="Top" x:Name="favorite_btn" Style="{StaticResource favorite_btn}" Checked="favorite_btn_Checked" Unchecked="favorite_btn_Unchecked" />

Jedoch bekomme ich am Ende folgendes heraus:

Herauskommen soll aber:

Was mach ich falsch?

Bild zum Beitrag
Computer, Schule, programmieren, C Sharp, Windows Presentation Foundation
C# Programm Zweidimensionales Array?

Moin,

sitze schon ne Weile an einem Programm, das einen Integer (nennen wir ihn Zahl ) vom Benutzer einlesen soll. Ausgehend von Zahl soll dann wie folgt ein zweidimensionales Array erstellt werden:

  • das Array ist Zahl x Zahl groß
  • das Element oben links im Array (also [0, 0] ) hat den Wert Zahl x Zahl
  • jedes weitere Element rechts daneben hat jeweils -1 weniger
  • anders beschrieben: es wird von links nach rechts abwärts gezählt beginnend vom Wert Zahl x Zahl

Da ich mir den Lösungsweg Stück für Stück erarbeiten möchte, könnt Ihr auf die komplette Lösung/ bzw. Erklärung verzichten.

Ich weiß, dass man Zeilen und Spalten bei dieser Aufgabe beide mit for-Schleifen erstellen kann, doch der Einfachheit halber möchte ich erst verstehen, wie ich mit den Spalten vorgehen muss.

Ohne for-Schleife bekomme ich die erste Spalte problemlos erstellt und das sieht dann so aus:

oder:

Console.WriteLine("Geben Sie eine Zahl ein, bei der nach dem"+ "Schema Zahl*Zahl ein Array erstellet werden soll:");
            string eingabe = Console.ReadLine();
            int intEingabe = Convert.ToInt32(eingabe);
            Console.WriteLine("\n");
            int[,] eingabeArray = new int[intEingabe,intEingabe];
            int eingabeArrayLänge = intEingabe * intEingabe;

            //Erste Spalte:
            eingabeArray[0, 0] = eingabeArrayLänge;
            eingabeArray[1, 0] = eingabeArray[0, 0] - 1;
            eingabeArray[2, 0] = eingabeArray[1, 0] - 1;
            Console.WriteLine(eingabeArray[0, 0] + "\n" + eingabeArray[1, 0] + "\n" + eingabeArray[2, 0]);

Bis dahin kein Problem doch wie schaffe ich es nun, dass ich die erste Spalte nicht "von Hand" ausfüllen muss? Das muss doch irgendwie mit ner for-Schleife zu machen sein?

Doch ich komme da nicht weiter - egal wie ich es drehe und wende.. Wäre nett wenn jemand mir die passende for-Schleife zeigen könnte.

LG

Bild zum Beitrag
Computer, Schule, Programm, programmieren, C Sharp, Informatik, Programmiersprache, For-Schleife, Ausbildung und Studium
Wie kriege ich dieses Unity2D Touch/Swipe-Jump-Movement-Problem gelöst?

Hallo,

ich programmiere zur Zeit ein Unity2D-Spiel jedoch ist gerade ein Problem aufgetreten, welches ich vermutlich nicht allein lösen kann.

Und zwar habe ich in meinem Spiel eine Swipe-Mechanik eingebaut, die mit einem Rigidbody sowie einem Vector2 funktioniert und eine Sprungmechanik, wo der Charakter konstant am Springen ist.

Das Problem ist aber, dass beides mit einem Rigidbody und einem Vector2 nicht/funktioniert. Dies führt dazu, dass, wenn ich die Swipe-Mechanik, der Character so unschön nach unten gezogen wird.

Ich füge mal den Code für ein besseres Verständnis ein:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
  public float jumpForce;
  float currentJumpForce;
  private bool isGrounded;
  Vector2 startPos;
  Vector2 movedPos;
  Vector2 endPos;
  public float speed;
  public Rigidbody2D rb;
  bool isTouch;

  // Start is called before the first frame update
  void Start()
  {
    currentJumpForce = jumpForce;
  }

  // Update is called once per frame
  void Update()
  {
    if (Input.touchCount > 0)
    {
      Touch touch = Input.GetTouch(0);
      
      switch(touch.phase)
      {
        case TouchPhase.Began:
          startPos = touch.position;
          isTouch = false;
          break;
        case TouchPhase.Moved:
          movedPos = touch.position;
          print(movedPos - startPos);
          isTouch = true;
          break;
      }
    }
  }

  void FixedUpdate()
  {
      if (isGrounded) <----- Sprung-Mechanik
      {
        rb.velocity = Vector2.up * currentJumpForce;
        isGrounded= false;
      }

      if (isTouch) <------ Swipe-Mechanik
      {
        if (startPos.x < movedPos.x)
        {
          rb.velocity = new Vector2(speed, 0); <----- Hier muss ich eine x- und y-Achse angeben. Jedoch führt der "0"-Wert dazu, dass der Character nach unten gedrückt wird (sehr langsam nach unten fällt)(Das liegt daran dass die Sprung-Machnik ebenfalls mit einem Rigidbody und Vector2 funktioniert und somit dann der Sprungwert auf "0" gesetzt wird!
        }
        else if (startPos.x > movedPos.x)
        {
          rb.velocity = new Vector2(-speed, 0);
        }

        isTouch = false;
      }
    }

    void OnCollisionEnter2D(Collision2D collision)
    {
      istap = true;
    }
  }

Könnte mir jemand bitte eine Alternative zu der Sprung- oder Swipe-Mechanik schreiben?

PS: PhysicsMaterial2D klappt nicht, da der Charakter immer höher Springt.

Computer, Schule, programmieren, C Sharp, Spieleentwicklung, Unity, Unity2D
Wie kann ich Text in einer Variable in C# speichern, ohne ihn zu entfernen, wenn ich zurück in die Main Methode komme?

Hey, ich habe vor ein paar Tagen angefangen C# zu lernen und versuche nun einige einfache Programme für Anfänger zu programmieren. Der Taschenrechner hat schon funktioniert jedoch scheitert es jetzt bei einem Schreibprogramm, was den Text temporär in einer Variable der Konsole speichern soll und wieder aufrufbar ist.

Am Anfang meine Codes, habe ich 4 String Variablen als Speicherplatz festgelegt. Wie diese aussehen, sieht man auf dem Bild.

Nun muss der Nutzer angeben, ob er einen neuen Text speichern oder ein vorhandenes Dokument öffnen will. Will er ein neues speichern wird mit Hilfe einer If-Abfrage geschaut, welche von den 4 Variablen noch leer ist.

...darunter sind mit "else if" noch die anderen Speicherplätze festgelegt.

Nach einer Eingabe wird der Text in dem String gespeichert und man gelangt zurück zur Main Methode, wo dann allerdings wieder das, was in die Variable eingetragen wurde gelöscht wird, da ich den Variablen ja einen Startwert zuweisen musste. (sieht man auf dem Bild) ich kann die variablen auch nicht später der Eingabe direkt zuweisen, da die Konsole erst überprüfen muss, welche Variable noch frei ist.

Ich hoffe es ist verständlich, was mein Problem ist und jemand kann mir weiterhelfen.

Vielen Dank schon mal im Voraus!

Bild zum Beitrag
Computer, Software, Technik, programmieren, C Sharp, Technologie, Visual Studio 2019
C# / Unity: Mit Leertaste Spiel starten?

Hallo,

ich habe ein Spiel in Unity programmiert, in dem man mit einem Block verschiedenen Blöcken ausweichen muss. Wenn man diese berührt, fängt alles noch einmal an (ziemlich einfaches Spielprinzip).

Der Spielerblock bewegt sich dauerhaft nach vorne und man hat die Möglichkeit, sich nach rechts oder links zu bewegen.

Nun möchte ich, wenn ich am Anfang des Spiels die Leertaste drücke, dass sich dieser Block ab dann dauerhaft nach vorne bewegt. Nur leider geht der Spieler immer nur ein paar Pixel nach vorne, wenn ich die Leertaste drücke. Aber er soll dauerhaft nach vorne gehen. Ich hoffe, Ihr versteht, was ich meine.

Hier mein Quellcode:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class MoveScript : MonoBehaviour
{
  public float movespeed = 7f;
  public float movespeed2 = 7f;

  // Start is called before the first frame update
  void Start()
  {
  }

  // Update is called once per frame
  void Update()
  {
    float H = Input.GetAxis("Horizontal") * movespeed;
    Vector3 vec = new Vector3(H, 0, 0);
    Vector3 frontvec = new Vector3(0, 0, movespeed2);

Ab hier versuche ich, dies zu programmieren:

if (Input.GetKeyDown(KeyCode.Space))
{
  transform.Translate(frontvec * movespeed2 * Time.deltaTime);
}

if (Input.GetKeyUp(KeyCode.Space))
{
  transform.Translate(frontvec * movespeed2 * Time.deltaTime);
}

Ab hier geht es mit dem Rest weiter:

    transform.Translate(vec * movespeed * Time.deltaTime);
  }
  
  private void OnCollisionEnter(Collision collision)
  {
    if (collision.gameObject.tag == "Starters")
    {
      SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }
  }
  
  private void OnTriggerEnter(Collider other)
  {
    if (other.gameObject.tag == "SpeedP")
    {
      movespeed2 += 1f;
    }
  
    if (other.gameObject.tag == "SideSPWN")
    {
      SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }
  }
}
C Sharp, Unity

Meistgelesene Fragen zum Thema C Sharp