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
zed leppelin
User
Beiträge: 16
Registriert: Dienstag 29. Oktober 2002, 15:04
Wohnort: Berlin

hallo,

ich habe die Aufgabe, einen SOAP-Client in Python für JIRA zu entwickeln.
Das ist soweit relativ klar und einfach zu realisieren mit SOAPpy. Alle Methoden, die ich von der SOAP-Schnittstelle benötige funktionieren einwandfrei. Nur das Übertragen von Dateien (Attachments) will nicht gelingen.

JIRA ist in Java geschrieben. Die SOAP-Schnittstelle stellt die Methode

Code: Alles auswählen

addAttachmentsToIssue() 
bereit, die als Parameter neben einem Authentifizierungsschlüssel und einem Issue-Key, die Namen der übertragenen Dateien und die Dateien selbst als Byte-Array verlangt.

Wie mache ich also aus einer Datei ein Byte-Array?

Das gleiche Problem tauchte schon mal im Forum auf:
http://www.python-forum.de/topic-5713.h ... =bytearray
Aber ohne Lösung.

Danke für Hilfe
Zed
--
this is zed
BlackJack

zed leppelin hat geschrieben:

Code: Alles auswählen

addAttachmentsToIssue() 
bereit, die als Parameter neben einem Authentifizierungsschlüssel und einem Issue-Key, die Namen der übertragenen Dateien und die Dateien selbst als Byte-Array verlangt.
Soweit ich mich erinnere war das kein Bytearray sondern ein Array von Bytearrays.
Wie mache ich also aus einer Datei ein Byte-Array?
Ich würd's erst einmal als Zeichenkette versuchen. In diesem Fall also eine Liste von Zeichenketten.
zed leppelin
User
Beiträge: 16
Registriert: Dienstag 29. Oktober 2002, 15:04
Wohnort: Berlin

Ich würd's erst einmal als Zeichenkette versuchen. In diesem Fall also eine Liste von Zeichenketten.
Das mit der Zeichenkette habe ich schon probiert. Das geht leider nicht. Die Methoden der SOAP-Schnittstelle wollen schon die angegebenen Datentypen, so meine Erfahrung.
Es bleibt also die Frage, wie ich aus einer Datei ein Byte-Array mache.
--
this is zed
BlackJack

Hast Du die Zeichenkette(n) auch in eine Liste gepackt?
zed leppelin
User
Beiträge: 16
Registriert: Dienstag 29. Oktober 2002, 15:04
Wohnort: Berlin

Ich habe folgendes gemacht:

Code: Alles auswählen

datei = file(<path to file>)
cont = datei.read()
cont64 = base64.encodestring(cont)

chararray1 = array.array('c')
chararray1.fromstring(cont64)

datei.close()
# Übertragung via SOAP-Schnittstelle
add = swr_jira.addAttachmentsToIssue(auth,issue_id,[<filename>],[chararray1])
Das überträgt die Datei tatsächlich nach JIRA. Allerdings ist sie dann nicht mehr brauchbar. Ein PDF z.B. lässt sich nicht mehr öffnen. Es hat auch einige Bytes zuviel (ca. 1,4%).
Es scheint also ein Codierungs-Problem vorzuliegen.
Aber welcher Art?
--
this is zed
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

zed leppelin hat geschrieben:Ich habe folgendes gemacht:

Code: Alles auswählen

datei = file(<path to file>)
Hi Zed Leppelin!

Blöde Frage -- ich weiß!
Hast du die Datei **binär** geöffnet?

Code: Alles auswählen

datei = file("<path to file>", "rb")
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Mit einer einfachen Zeichenkette mit dem Dateiinhalt in der Liste geht es nicht? Oder nur diese Zeichenkette als base64 ohne sie in ein `array` zu packen?

Und schau Dir mal die Daten genauer an die angekommen sind. Also in einem Hexeditor, wie's aussieht, ob's kompletter Müll ist oder nur etwas kaputt.

Zum Testen könntest Du auch mal 256 Bytes auf verschiedene Weisen übertragen die einfach alle Werte von 0 bis 255 enthalten. Dann lässt sich auf der Empfängerseite leichter ein Muster erkennen.
zed leppelin
User
Beiträge: 16
Registriert: Dienstag 29. Oktober 2002, 15:04
Wohnort: Berlin

Es gibt keinen Unterschied, ob ich die Datei binär öffne oder nicht. Nach dem Upload sind beide Ergebnis-Dateien aufs Byte gleich, aber eben größer als die Ursprungsdatei.

Das einfache Übertragen der Zeichenkette in einer Liste geht nicht, egal ob base64 oder nicht. Ich erhalte Fehlermeldungen der SOAP?-Schnittstelle:
java.lang.IllegalArgumentException: argument type mismatch
Das ist eindeutig, denke ich.

Bei der Übertragung einer einfachen .txt-Datei mit 7-bit-ascii-Zeichensatz als Inhalt kommt im Ergebnis nur Müll heraus. Im Hexeditor geöffnet sehe ich in der Ursprungsdatei einen schön regelmäßig angeordneten Hexcode:
00 01 02 03 04 ..
10 11 12 13 14 ..
20 ..
..
F0 ..

In der hochgeladenen Datei hingegen ist es einziges Chaos. Es läßt sich auch kein Muster erkennen.

Ich sehe nach wie vor ein Codierungs-Problem. Nur weiß ich nicht wo.
Hat noch jemand eine Idee?

Vielen Dank für Tipps.
--
this is zed
BlackJack

Du sagst leider nicht wobei der Müll auftritt oder wie der genau aussieht.

Wie sieht's mit einem `array.array` in einer Liste aus, das die Daten 1:1 enthält, also nicht base64 kodiert?

Poste doch mal ein paar Möglichkeiten der Übertragung von den 256 Testbytes und die jeweiligen Ergebnisse als Hexdumps.

Soweit ich weiss bietet Jira auch eine XML-RPC Schnittstelle, falls die alles notwendige bietet, ist das sicher ein einfacherer Weg.
Antworten