Byte in Int umwandeln

  • C#
  • .NET (FX) 1.0–2.0

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Byte in Int umwandeln

    Hallo,

    ich habe wieder einmal ein Problem. Diesmal hoffentlich im richtigen Forum.

    Es geht darum ich möchte einen Byte (00000000) in einen Integer convertieren, sodass der int ca. so aussieht:
    00000001 => 1
    00010000 => 16

    die Zahlen sollen als Integer ausgegeben werden.

    Hintergrund:
    Ich bekomme von eine SPS 29 Bytes für Fehlermeldungen. Jeder Bit kann ja 1 oder 0 sein.
    ist zb auf position 3 der bit auf 1 gesetzt, ist die zahl eine 4. das bedeutet, ich sollte für diesen Byte eine 4 als Integer raus bekommen.
    Da ich dies nicht auf 29 weitere anwenden möchte, komme ich nun zu meiner frage.

    Gibt es eine Funktion oder einen einfachen und schnellen weg, die bytes in integer werte zu konvertieren oder muss man wirklich eine zählschleife machen und dann jedes mal jede der 8 positionen abfragen?

    BTW sitze ich bereits 8 Stunden in der Firma und allein 3 an diesem Problem. Mein Kopf ist voll, deshalb bitte ich drum`Rechtsschreibfehler für sich zu behalten.

    Releases:
    IceTea | QR-Converter by NudelHolz - einfach Text & URL zu QR Konvertieren.
    @NudelHolz So was:

    VB.NET-Quellcode

    1. Dim by As Byte = DAS_BYTE_KOMMT_IRGENDWOHER
    2. Dim in As Integer = by
    3. ' oder gleich
    4. Dim in As Integer = DAS_BYTE_KOMMT_IRGENDWOHER

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das Byte, das die Bits 00000001 beinhaltet, hat bereits den Wert 1. Und das Byte, das die Bits 00010000 beinhaltet, hat bereits den Wert 16.
    Aus der aktuellen Problembeschreibung kann ich nicht rauslesen, was genau Du vor hast.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @NudelHolz
    • In welcher Form liegt das "Byte" nach dem Auslesen vor? Wirklich als Byte? Oder als String?
    • Ist beim Auslesen aus der SPS den immer genau 1 Bit gesetzt, oder können auch mehrere gesetzt sein?
    • Soll nach die "Umwandlung" in Integer eine weitere Aktion angestossen werden?
    • Wie häufig wird die SPS ausgelesen? Kann Auswirkungen auf den Code haben.
    Hallo!
    Welche SPS hast du? Wenns eine Siemens ist hast du eine andere Bytefolge wie am pc. Deshalb ist es am besten die libnodave.dll zu verwenden weil du hier die verbindung einfach herstellen kannst und alle werte richtig raus kommen. Noch besser ist die libnidavetoolboy von jochen kühner. Findest alles in sps-forum.de
    Ei e weitere alternative wäre ODBC zu verwenden
    Der Beitrag wurde aus 100% wiederverwendbaren Elektronen erstellt!
    Little- oder Big-Endian spielen bei einem Byte keine Rolle.

    Quellcode

    1. Z. B. wird die Zahl 6 so gespeichert:
    2. Little Endian Byte : 00000110 ---- 06 Hex
    3. Big Endian Byte ---: 00000110
    4. Little Endian Int16 : 00000110 00000000 ---- 06 00 Hex
    5. Big Endian Int 16---: 00000000 00001100 ---- 00 06 Hex

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Eierlein“ ()

    petaod schrieb:

    Es dreht sich hier vermutlich um Little-Endian-Datenströme.
    Ohne eine weitere Äußerung von @NudelHolz ist das alles pure Annahmologie, und so lange sollten wir keine Spekulatius backen :!:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Entschuldigt bitte die späte Antwort.
    Ich habe nebenbei noch 3 andere Projekte am laufen und bin gerade minimal überlastet

    Also. Ich bekomme einen Byte von der SPS. Es ist kein String oder Integer.
    Meine vorige Idee, dass man den Byte einfach zusammenzählt war DUMM, da - wenn ich zb 00010000 wieder bekomme keine Rechnung stattfinden soll,
    sondern dass die Position abgefragt werden muss.

    Es wäre nämlich extrem umständlich jedes mal zu rechnen ob jetzt 01000100, 00000001, 01111100 oder so wieder bekommen würde, das sind zich Varianten.


    Also habe ich einen neuen Plan, wie ich den richtig umsetze ist mir noch nicht ganz bewusst:

    Ich bekomme z.B. 10000001 wieder.
    Das bedeutet, ich habe an der ersten und an der letzten Position eine 1!
    Also muss ich wissen, wo eine 1 ist und wo eine 0 ist.

    Es können nämlich mehrere Fehlermeldungen/Störmeldungen auf einmal kommen. Im Sütronpanel damals konnte man ganz einfach
    hochzählen, die Funktion dafür gab es schon und man konnte Positionsmäßig einfach eine Fehlermeldung ausgeben.

    Tut mir echt leid, ich danke schonmal für die super Hilfe von euch!


    EDIT:

    Um es nochmal enauer zu erklären:




    So. ist also jetzt zb eine 1 auf dem bit 4 und bit 5 gesetzt soll er mir eine 4 und eine 5 ausgeben.
    Wie realisiere ich das am besten?

    Releases:
    IceTea | QR-Converter by NudelHolz - einfach Text & URL zu QR Konvertieren.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „NudelHolz“ ()

    Definiere

    NudelHolz schrieb:

    Byte von der SPS
    Wie landet das im Speicher in .NET?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Von BECKHOFF gibt es eine DLL mit der man die Werte von der SPS abfragen kann.
    Die DLL heißt ADS.NET

    ich kann den Byte von der SPS direkt als Byte in meinem Programm nutzen.



    So sieht meine Deklaration aus:

    C#-Quellcode

    1. //sps_daten.cs (Klasse zur auslagerung um Zugriff von mehreren Formen zu erleichtern)
    2. public static byte[] stoernummer = new byte[29];
    3. // AdsStream der die Daten aufnehmen soll
    4. AdsStream dataStream = new AdsStream(28 * 2);
    5. BinaryReader binRead = new BinaryReader(dataStream);
    6. //Array komplett auslesen
    7. tcClient.Read(aget_stoermeldungen, dataStream);
    8. lbArray.Items.Clear();
    9. dataStream.Position = 0;
    10. for (int i = 0; i < 28; i++)
    11. {
    12. sps_daten.stoernummer[i] = binRead.ReadByte();
    13. //Zum anzeigen in listbox eintragen
    14. lbArray.Items.Add(sps_daten.stoernummer[i]);
    15. }

    Releases:
    IceTea | QR-Converter by NudelHolz - einfach Text & URL zu QR Konvertieren.
    @NudelHolz Dann war doch Deine Frage mit Post #2 bereits fertig beantwortet. :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!