logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

C# - Jak zamienić string z textboxa na tablicę byte w formacie HEX?

ienecode 08 Paź 2015 09:33 2100 23
REKLAMA
  • #1 15050765
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    Witam, jak zamienić wpisaną do textboxa liczbę np 11 na tablice elementy w tablicy byte tak że
    byte[2] = 0x00;
    byte[3] = 0x11;

    albo inny przypadek
    1243
    i tablica ma być:
    byte[2] = 0x12;
    byte[3] = 0x43;

    No i liczby w byte są jako HEX 1 bajt dla liczby 0x23
    ?
  • REKLAMA
  • #2 15050796
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    Kod: C#
    Zaloguj się, aby zobaczyć kod
  • #3 15050834
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    size = (len >> 1);
    po co w prawo o 1 ?

    Dodano po 12 [minuty]:

    Skopiowałem twój kod i w labelu po wciśnięciu przycisku pojawia się trójkącik .
  • REKLAMA
  • #4 15050881
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    Damian7546 napisał:
    size = (len >> 1);
    po co w prawo o 1 ?
    Ponieważ każdy bajt jest reprezentowany dwoma znakami, czyli dwa razy mniej bajtów.

    Damian7546 napisał:
    Skopiowałem twój kod i w labelu po wciśnięciu przycisku pojawia się trójkącik.
    to wpisz w TextBox1 to:
    44616D69616E37353436

    Masz w obie strony:
    Kod: C#
    Zaloguj się, aby zobaczyć kod
  • #5 15050893
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    -psiak- napisał:
    to wpisz w TextBox1 to:
    44616D69616E37353436


    No ładnie :)
    a wpisz w textbox
    1111
    albo
    11
    :)
  • Pomocny post
    #6 15050894
    Rezystoreczek
    Poziom 20  
    Posty: 273
    Pomógł: 52
    Ocena: 14
    Damian7546 napisał:
    Witam, jak zamienić wpisaną do textboxa liczbę np 11 na tablice elementy w tablicy byte tak że
    byte[2] = 0x00;
    byte[3] = 0x11;

    albo inny przypadek
    1243
    i tablica ma być:
    byte[2] = 0x12;
    byte[3] = 0x43;


    ale 11 na hex to 0x0B... a nie 0x11! Tobie nie chodzi przypadkiem o BCD (ang. Binary-Coded Decimal), czyli system dziesiętny zakodowany dwójkowo :?:
  • REKLAMA
  • #7 15050910
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    podajac liczbe dziesietnie w textbox chce miec ja jako hex.
    Damian7546 napisał:
    np
    12
    i tablica ma być:
    byte[2] = 0x00;
    byte[3] = 0x12;


    lub podaje w textbox 1234
    i tablica ma być:
    byte[2] = 0x12;
    byte[3] = 0x34;
  • REKLAMA
  • #9 15050918
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    Tak masz racje @Rezystoreczek zrobilem błąd.
    Ma być tak:

    Damian7546 napisał:
    podaje w textbox 12
    i tablica ma być:
    byte[2] = 0x00;
    byte[3] = 0x0C;


    Dodano po 0 [sekundy]:
  • #10 15050934
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    Damian7546 napisał:
    podaje w textbox 12
    i tablica ma być:
    byte[2] = 0x00;
    byte[3] = 0x0C;

    1. To w jaki sposób podasz kody ASCII większe niż 99 (w bajcie się mieści liczba 0..255, czyli 3 znaki)?
    2. W kodzie co podałem zamień 16 na 10 (w tym konwertującym z powrotem - to samo)
    3. Czy przypadkiem 1234 nie powinno zostać skonwertowane do 0x04 0xDB? Czyli kod:
    Kod: C#
    Zaloguj się, aby zobaczyć kod
  • #11 15050962
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    No to może jeszcze inaczej powiem.
    Chce wysłać ramkę modbus'ową bez CRC która będzie wpisana w textboxie.

    1bajt adres
    1bajt funkcja
    2bajty rejestr
    2bajty ileRej
    Np:

    1431110

    i taka tablica do wysłania ma mieć postać:

    znak[0] = 0x14;
    znak[1] = 0x03;
    znak[2] = 0x00;
    znak[3] = 0x11;
    znak[4] = 0x00;
    znak[5] = 0x10;

    inny przypadek, wpisuje do textbox ramke:


    i to ma mieć 6 bajtów
    1311231032

    tablica ma być:

    znak[0] = 0x01;
    znak[1] = 0x03;
    znak[2] = 0x23;
    znak[3] = 0x11;
    znak[4] = 0x32;
    znak[5] = 0x10;

    Już wiadomo o co chodzi ?
  • Pomocny post
    #12 15050972
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    To ma @Rezystoreczek racje czy nie?
    Przed chwilą pisałeś że 12 to 0xC teraz piszesz że 14 to 0x14.
    Nawet pomijając takie drobne niezgodności ...

    Nie da się tego zrobić tak jak oczekujesz, ponieważ nie wiadomo jak podzielić tą twoją liczbę na bajty.
    Np, 1431110 podzieliłeś jako: 14, 3, 0, 11, 0, 10
    a czemu nie: 1, 43, 0, 11, 0, 10
    lub nie: 1, 0, 4, 0, 3, 11, 10
    lub nie: 1, 4, 3, 1, 1, 1, 0
    liczba możliwych podziałów jest naprawdę gigantyczna.
  • #13 15050997
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    Hmm, no to może na 4 textboxach ?
    1 bajt -txt1
    1 bajt -txt2
    2bajty -txt3
    2bajty -txt4
    ?
    I w tych po dwa bajty jaka by liczba nie byla to ma miec 2 bajty. 1 w txt3 to 0001, itp
  • #15 15051023
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    eh,
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Do 9 się zgadza, a juz 10 to jest 010, a powinno byc 0A, co nie ?
  • #16 15051024
    Rezystoreczek
    Poziom 20  
    Posty: 273
    Pomógł: 52
    Ocena: 14
    Damian7546 napisał:
    No to może jeszcze inaczej powiem.
    Chce wysłać ramkę modbus'ową bez CRC która będzie wpisana w textboxie.

    ....

    Już wiadomo o co chodzi ?


    to ja bym zrobił tak, że każdy bajt (dwa znaki) czymś oddzielasz ...
    PRZYKŁAD:
    w textboxie wpisujesz AB;32;FF;9A;3A;
    i to są kody HEX bajtów, oddzielone średnikami :!:
    W kodzie ja parsujesz - no i wysyłasz.
    Będzie jasno i zrozumiale.
    W ten sposóbo trzymasz JASNY I LOGICZNY FORMAT ZAPISU i nie będzie niejasności co jest czym ;)
  • #17 15051031
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    -psiak- napisał:
    3. Czy przypadkiem 1234 nie powinno zostać skonwertowane do 0x04 0xDB? Czyli kod:
    Kod: csharp [rozwiń]
    [zaznacz wszystko]

    byte[] buff = BitConverter.GetBytes(Convert.ToInt16(textBox1.Text));
    Array.Reverse(buff);




    Raczej powinno być skonwertowane do
    04D2

    Dodano po 48 [sekundy]:

    Rezystoreczek napisał:
    to ja bym zrobił tak, że każdy bajt (dwa znaki) czymś oddzielasz ...
    PRZYKŁAD:
    w textboxie wpisujesz AB;32;FF;9A;3A;
    i to są kody HEX bajtów, oddzielone średnikami :!:
    W kodzie ja parsujesz - no i wysyłasz.
    Będzie jasno i zrozumiale.
    W ten sposóbo trzymasz JASNY I LOGICZNY FORMAT ZAPISU i nie będzie niejasności co jest czym ;)

    lepiej bedzie w roznych textboxach
  • #18 15051039
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    Damian7546 napisał:
    Do 9 się zgadza, a juz 10 to jest 010, a powinno byc 0A, co nie ?
    OMG!
    Kod: C#
    Zaloguj się, aby zobaczyć kod
  • #19 15051056
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    hm, dalej konwertujesz z byte na hexa, a ja chciałem z stringa
  • #20 15051068
    Rezystoreczek
    Poziom 20  
    Posty: 273
    Pomógł: 52
    Ocena: 14
    Damian7546 napisał:

    lepiej bedzie w roznych textboxach


    znasz tego modbusa czy nie :?:
    Tam nie ma określonej długości pakietu, mogą być różne... kilka textboxów tylko komplikuje sprawę.
    Chociaż to zależy jeszcze co z tego modbusa masz obsłużyć ;)


    z stringa na hexa (bajta):

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    to samo dla wiekszej ilosci:


    Kod: C#
    Zaloguj się, aby zobaczyć kod


    PS: pisane bez kompiladła, proszę sprawdź syntax, ale skoro piszesz modbusa to zakładam że znasz też podstawy c# ;)
  • #21 15051106
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    No to tak:
    Napisałem jak mówiłeś:

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    Wpisuje do textboxa "textRej" wartość 10, i w labelu otrzymuje 16 .. a w hex to chyba A , co nie ?
  • #22 15051112
    Rezystoreczek
    Poziom 20  
    Posty: 273
    Pomógł: 52
    Ocena: 14
    Podajesz 10 w hexie (czyli 1*16+0), czyli dziesietnie 16.

    To:

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    zamienia na dec, wiec 16
    Natomiast to:
    Kod: C#
    Zaloguj się, aby zobaczyć kod

    na hex, wiec 10.

    oj, mylisz systemy, i stąd zamieszanie ;)
    Już wszystko jasne?
  • Pomocny post
    #23 15051125
    -psiak-
    Poziom 32  
    Posty: 1185
    Pomógł: 259
    Ocena: 107
    @Damian7546 obejrzyj jak zadziała to:
    Kod: C#
    Zaloguj się, aby zobaczyć kod


    P.S.
    Damian7546 napisał:
    Wpisuje do textboxa "textRej" wartość 10, i w labelu otrzymuje 16 .. a w hex to chyba A , co nie ?
    Widzę że nie rozumiesz jednej rzeczy, w bajcie liczba zapisana w postaci kodu. Możesz używać tą liczbę do dodawania, odejmowania, mnożenia oraz innych operacji, natomiast nie możesz jej zobaczyć bo nie ma jak. Aby jednak zobaczyć tą liczbę musisz ją najpierw skonwertować na postać napisu, czyli przedstawić w jakimś systemie liczbowym. Mogą to być różne systemy liczbowe od binarnego po 36-kowy system ba nawet może to być reprezentacja w postaci liczb rzymskich. Nadal jednak będzie to jedynie reprezentacja tego bajtu a nie on sam.

    Może jeszcze mały przykład:
    Kod: C#
    Zaloguj się, aby zobaczyć kod
  • #24 15051150
    ienecode
    Poziom 21  
    Posty: 2097
    Ocena: 96
    Rezystoreczek napisał:
    Podajesz 10 w hexie (czyli 1*16+0), czyli dziesietnie 16.

    ja chciałem odwrotnie

    Dodano po 4 [minuty]:

    @-psiak- i to właśnie jest to, dzięki!

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono temat konwersji wartości liczbowych z textboxa na tablicę bajtów w formacie HEX w języku C#. Użytkownik chciał przekształcić liczby dziesiętne, takie jak 11 czy 1243, na odpowiednie wartości HEX w tablicy bajtów. Odpowiedzi zawierały różne podejścia do konwersji, w tym użycie metod `Convert.ToByte` oraz `BitConverter.GetBytes`. Wskazano również na problemy związane z interpretacją danych oraz konieczność jasnego podziału wartości na bajty. Użytkownicy sugerowali użycie wielu textboxów dla lepszej organizacji danych oraz podawali przykłady kodu, który mógłby być użyty do realizacji tego zadania.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA