ASCII Darstellung unterbinden

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
sg_pyth
User
Beiträge: 10
Registriert: Montag 28. Mai 2007, 11:54

Hallo Leute,

ich möchte einen Datenaustausch zwischen SPS und PC realsieren. Von der SPS werden dabei INT Werte via TCP/IP geschickt. Diese Daten werden dann von einem Python Server in eine Datei geschrieben.

Der Python Server hat folgenden Code:

Code: Alles auswählen

#! /usr/bin/env python
# -*- encoding: latin1 -*-

# Dieser TCP-Server sendet alle Daten, die er empfängt an den
# Client als Antwort zurück

from socket import *
import time

# Der standard Echo Port ist nicht sehr nützlich, da er root
# Rechte erfordert. Wir nehemen den Port 50007
ECHO_PORT = 2000
BUFSIZE = 1024
def main():
# TCP-Socket erstellen und an Port binden
    s = socket(AF_INET, SOCK_STREAM)
    f = file('C:\\gedicht.txt', 'a')
    print "Socket initiert"
    x = gethostname()
    print x
    y = gethostbyname(x)
    print y
    s.bind(('', ECHO_PORT))
    s.listen(1)
    print "Server gestartet"
    # Warte auf eine Verbindung zum Server
    conn, (remotehost, remoteport) = s.accept()
    print 'Verbunden mit %s:%s' % (remotehost, remoteport)

    while 1:
        # Empfange daten vom Client
        data = conn.recv(BUFSIZE)
        zeit = time.strftime('%d.%m.%Y %H:%M:%S')
        zeitm = time.clock()
        print  (time.strftime('%d.%m.%Y %H:%M:%S') + '\t' + str(time.clock()) + '\t' + repr(data) + '\t') 
        f.write(time.strftime('%d.%m.%Y %H:%M:%S') + '\t' + str(time.clock()) + '\t' + repr(data) + '\t')
        f.write('\n')
        if not data:
                # Die Verbindung wurde getrennt
                # Abbruch
                break

    # Sende die Daten zurück zum client
    #conn.send(data)
    # Socket schließen
    s.close()
    f.close()
    print('Verbindung beendet')
if __name__ == '__main__':
    main()

Durch den Befehl repr() habe ich bereits erreicht, dass Großteil der Daten in der hexadezimalen Darstellung angezeigt wird, z. B. Bytewert 0 als 'x\00'. Wird jedoch ein Bytewert übertragen, der einem druckbaren Zeichen entspricht, dann wird dieses Zeichen in die Datei geschrieben. Wie kann man erreichen, dass nur Bytewerte und keine ASCII-Zeichen in die Datei geschrieben werden?
BlackJack

Hilft das weiter:

Code: Alles auswählen

In [35]: '\x00a\xffz'.encode('hex')
Out[35]: '0061ff7a'
?

Edit: Oder willst Du wirklich die Bytes in der Datei stehen haben? Dann lass das `repr()` einfach weg.
Benutzeravatar
Drake
User
Beiträge: 71
Registriert: Mittwoch 14. März 2007, 15:48
Wohnort: Bremen
Kontaktdaten:

An dieser Stelle eine kleine Frage an BlackJack:

Wieso steht bei dir immer dieses In und Out davor? Das sieht recht schön aus, machst du das manuell oder wo ist das dabei? ;)
BlackJack

Das ist, neben einem Haufen anderer nützlicher Funktionen, bei IPython dabei. Ein paar von den Möglichkeiten:

Man kann mit `who` abfragen welche Namen definiert sind. Bei #59 habe ich Tab gedrückt, dann wird vervollständigt bzw angezeigt was möglich ist. Mit einem ? kann man sich die Docstring-Dokumentation anzeigen lassen. Und über den Unterstrich + Nummer kommt man an alle alten Ergebnisse heran.

Code: Alles auswählen

In [57]: who
a       os      subprocess      sys     test

In [58]: 'Hallo'.encode('base64')
Out[58]: 'SGFsbG8=\n'

In [59]: subprocess.
subprocess.CalledProcessError  subprocess.__setattr__
subprocess.MAXFD               subprocess.__str__
subprocess.PIPE                subprocess._active
subprocess.Popen               subprocess._cleanup
subprocess.STDOUT              subprocess._demo_posix
subprocess.__all__             subprocess._demo_windows
subprocess.__class__           subprocess.call
subprocess.__delattr__         subprocess.check_call
subprocess.__dict__            subprocess.errno
subprocess.__doc__             subprocess.fcntl
subprocess.__file__            subprocess.list2cmdline
subprocess.__getattribute__    subprocess.mswindows
subprocess.__hash__            subprocess.os
subprocess.__init__            subprocess.pickle
subprocess.__name__            subprocess.select
subprocess.__new__             subprocess.sys
subprocess.__reduce__          subprocess.traceback
subprocess.__reduce_ex__       subprocess.types
subprocess.__repr__

In [59]: subprocess.call?
Type:           function
Base Class:     <type 'function'>
String Form:    <function call at 0x83e310c>
Namespace:      Interactive
File:           /home/bj/subprocess.py
Definition:     subprocess.call(*popenargs, **kwargs)
Docstring:
    Run command with arguments.  Wait for command to complete, then
    return the returncode attribute.

    The arguments are the same as for the Popen constructor.  Example:

    retcode = call(["ls", "-l"])


In [60]: _58
Out[60]: 'SGFsbG8=\n'
sg_pyth
User
Beiträge: 10
Registriert: Montag 28. Mai 2007, 11:54

Hallo Black Jack,

danke für die schnelle Antwort. Mit dem Befehl
data.encode("HEX") wird der Inhalt von data tatsächlich hexadezimal ausgegeben.

Grüsse,

s.g.
Antworten