byte array

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
seppl43
User
Beiträge: 4
Registriert: Donnerstag 13. April 2006, 23:14

Hallo allerseits,

ich bastele an einer Schnittstelle zu einem Java-Programm. Und dieses Programm verlangt bei der Übergabe von Dateien, dass diese in einem Byte-Array abgeliefert werden.

Wie stelle ich das in Python an, z.B. eine einfache Textdatei in ein solches Byte-Array zu transformieren?

Vielen Dank für Tipps.

Seppl
BlackJack

Wie machst Du denn die Anbindung? Du musst ja irgendwie ein Java-Byte-Array erstellen. Auf Java-Seite bekäme man das zum Beispiel aus einer Java-Zeichenkette mit der `getBytes()` Methode.
seppl43
User
Beiträge: 4
Registriert: Donnerstag 13. April 2006, 23:14

BlackJack hat geschrieben:Wie machst Du denn die Anbindung? Du musst ja irgendwie ein Java-Byte-Array erstellen. Auf Java-Seite bekäme man das zum Beispiel aus einer Java-Zeichenkette mit der `getBytes()` Methode.

Die Anbinding erfolgt über eine SOAP-Schnittstelle des Java-Programms. Es handelt sich also um eine Webanwendung (JIRA). Für die Übertragung der Dateien steht eine SOAP-Methode zur Verfügung. Diese verlangt die Übergabe als Byte-Array. Ich muss dieses also mit Python erzeugen.
BlackJack

Das kann ich nicht so recht glauben. Eine Datei als (SOAP) Byte-Array zu übertragen ist ziemlich unwahrscheinlich. Da würde jedes Byte einzeln als Dezimalwert in ein XML-Tag umgewandelt werden. Binärdaten werden normalerweise als Base64 kodiert übertragen.

Leider mag SOAPpy das WSDL von JIRA nicht. :-(
seppl43
User
Beiträge: 4
Registriert: Donnerstag 13. April 2006, 23:14

Leider mag SOAPpy das WSDL von JIRA nicht. :-(
Kann ich nicht bestätigen. Alle Methoden der SOAP-Schnittstelle von JIRA konnte ich bislang ohne Probleme ausführen. Mein SOAP-Client läuft prima. Kniffelig ist nur, die Datenformate herauszubekommen, die die SOAP-Methoden brauchen, Jedenfalls, wenn man kein JIRA-Spezialist und kein JAVA-Profi ist.

Und so ist es auch mit der Methode zum Hinzufügen einer Datei. Im JIRA-Forum erhielt ich folgende Aussage:
The one thing to remember is that you need to send the file as a byte array.
In einem in JAVA geschriebenem Beispiel der JIRA-Macher sieht der Methoden-Aufruf so aus:

Code: Alles auswählen

boolean added = jiraSoapService.addAttachmentsToIssue(token,
                                                      issue.getKey(),
                                                      new String[]{tmpFile.getName()},
                                                      new byte[][]{getBytesFromFile(tmpFile)});
Da sehe ich (als JAVA-Laie) nichts von BASE64. Es bleibt für mich die Frage, wie ich mit Python das geforderte Byte-Array aus einer Datei erstelle.

Wenn dazu jemand noch eine Idee hat, wäre das prima.

Seppl
BlackJack

seppl43 hat geschrieben:
Leider mag SOAPpy das WSDL von JIRA nicht. :-(
Kann ich nicht bestätigen. Alle Methoden der SOAP-Schnittstelle von JIRA konnte ich bislang ohne Probleme ausführen. Mein SOAP-Client läuft prima. Kniffelig ist nur, die Datenformate herauszubekommen, die die SOAP-Methoden brauchen, Jedenfalls, wenn man kein JIRA-Spezialist und kein JAVA-Profi ist.
Kannst Du nicht bestätigen, weil Du es offensichtlich nicht ausprobiert hast. WSDL ist eine Schnittstellenbeschreibunssprache (in XML) für SOAP. Damit Du eben nicht selbst herausfinden musst, wie etwas kodiert werden soll. Beim laden der WSDL Datei gibt's aber eine Ausnahme. Jedenfalls bei mir.
Und so ist es auch mit der Methode zum Hinzufügen einer Datei. Im JIRA-Forum erhielt ich folgende Aussage:
The one thing to remember is that you need to send the file as a byte array.
In einem in JAVA geschriebenem Beispiel der JIRA-Macher sieht der Methoden-Aufruf so aus:

Code: Alles auswählen

boolean added = jiraSoapService.addAttachmentsToIssue(token,
                                                      issue.getKey(),
                                                      new String[]{tmpFile.getName()},
                                                      new byte[][]{getBytesFromFile(tmpFile)});
Da sehe ich (als JAVA-Laie) nichts von BASE64. Es bleibt für mich die Frage, wie ich mit Python das geforderte Byte-Array aus einer Datei erstelle.
Zu der Methode ein Auszug aus der WSDL Datei:

Code: Alles auswählen

   <wsdl:message name="addAttachmentsToIssueRequest">

      <wsdl:part name="in0" type="xsd:string"/>

      <wsdl:part name="in1" type="xsd:string"/>

      <wsdl:part name="in2" type="impl:ArrayOf_xsd_string"/>

      <wsdl:part name="in3" type="impl:ArrayOf_xsd_base64Binary"/>

   </wsdl:message>
Da steht was von Base64. Wie gesagt, eine Datei so zu kodieren das jedes Byte einzeln Dezimal in ein XML-Tag verpackt würde, wäre ziemlich, äh, suboptimal.
seppl43
User
Beiträge: 4
Registriert: Donnerstag 13. April 2006, 23:14

Kannst Du nicht bestätigen, weil Du es offensichtlich nicht ausprobiert hast.
Woher zum Teufel willst du wissen, ob ich es probiert habe oder nicht? Lies mal genau, was ich geschrieben habe: Der Client läuft und funktioniert
ganz ausgezeichnet.
WSDL ist eine Schnittstellenbeschreibunssprache (in XML) für SOAP. Damit Du eben nicht selbst herausfinden musst, wie etwas kodiert werden soll.
Es ist immer wieder schön, wenn andere Leute zeigen, was sie so alles wissen. :wink:
Beim laden der WSDL Datei gibt's aber eine Ausnahme. Jedenfalls bei mir.
Tja, bei mir nicht. WSDL-Datei wird geladen, es gibt keine Ausnahme, alle SOAP-Methoden sind aufrufbar und funktionieren. Vielleicht arbeitest du mit einer alten JIRA-Version?
Zu der Methode ein Auszug aus der WSDL Datei:

...

Da steht was von Base64. Wie gesagt, eine Datei so zu kodieren das jedes Byte einzeln Dezimal in ein XML-Tag verpackt würde, wäre ziemlich, äh, suboptimal.
Schön. Was mich aber interessiert ist, ob es eine Entsprechung zum Methoden-Aufruf aus JAVA gibt. Letztlich, ob es in Python etwas Vergleichbares gibt zu:

Code: Alles auswählen

getBytesFromFile(tmpFile);
Vielleicht gibt es das nicht. Ok. Vielleicht kann SOAP.py damit nicht umgehen. OK.
Das wären dann wenigstens konkrete Antworten.
BlackJack

seppl43 hat geschrieben:
Kannst Du nicht bestätigen, weil Du es offensichtlich nicht ausprobiert hast.
Woher zum Teufel willst du wissen, ob ich es probiert habe oder nicht?
Okay, ich bin halt davon ausgegangen, das sich Dein SOAPpy + JIRA-WSDL dann auch nicht vertragen hätten. Beides übrigens am Wochenende erst aus dem Netz gezogen.
WSDL ist eine Schnittstellenbeschreibunssprache (in XML) für SOAP. Damit Du eben nicht selbst herausfinden musst, wie etwas kodiert werden soll.
Es ist immer wieder schön, wenn andere Leute zeigen, was sie so alles wissen. :wink:
Da Du sehr spärlich mit Informationen herausrückst, dachte ich, ich sags Dir lieber mal.
Zu der Methode ein Auszug aus der WSDL Datei:

...

Da steht was von Base64. Wie gesagt, eine Datei so zu kodieren das jedes Byte einzeln Dezimal in ein XML-Tag verpackt würde, wäre ziemlich, äh, suboptimal.
Schön. Was mich aber interessiert ist, ob es eine Entsprechung zum Methoden-Aufruf aus JAVA gibt. Letztlich, ob es in Python etwas Vergleichbares gibt zu:

Code: Alles auswählen

getBytesFromFile(tmpFile);
Vielleicht gibt es das nicht. Ok. Vielleicht kann SOAP.py damit nicht umgehen. OK.
Das wären dann wenigstens konkrete Antworten.
Schon mal versucht die Datei einfach zu laden? Also ``open(dateiname, 'rb')`` und dann mit `read()` komplett einlesen?
Antworten