Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Konwersje C# - Zamiana string na HEX

ienecode 08 Oct 2015 09:33 1776 23
  • #1
    ienecode
    Level 21  
    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
    ?
  • #2
    -psiak-
    Level 32  
    Code: csharp
    Log in, to see the code
  • #3
    ienecode
    Level 21  
    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 .
  • #4
    -psiak-
    Level 32  
    Damian7546 wrote:
    size = (len >> 1);
    po co w prawo o 1 ?
    Ponieważ każdy bajt jest reprezentowany dwoma znakami, czyli dwa razy mniej bajtów.

    Damian7546 wrote:
    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:
    Code: csharp
    Log in, to see the code
  • #5
    ienecode
    Level 21  
    -psiak- wrote:
    to wpisz w TextBox1 to:
    44616D69616E37353436


    No ładnie :)
    a wpisz w textbox
    1111
    albo
    11
    :)
  • Helpful post
    #6
    Rezystoreczek
    Level 20  
    Damian7546 wrote:
    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 :?:
  • #7
    ienecode
    Level 21  
    podajac liczbe dziesietnie w textbox chce miec ja jako hex.
    Damian7546 wrote:
    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;
  • #9
    ienecode
    Level 21  
    Tak masz racje @Rezystoreczek zrobilem błąd.
    Ma być tak:

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


    Dodano po 0 [sekundy]:
  • #10
    -psiak-
    Level 32  
    Damian7546 wrote:
    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:
    Code: csharp
    Log in, to see the code
  • #11
    ienecode
    Level 21  
    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 ?
  • Helpful post
    #12
    -psiak-
    Level 32  
    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
    ienecode
    Level 21  
    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
    ienecode
    Level 21  
    eh,
    Code: c
    Log in, to see the code


    Do 9 się zgadza, a juz 10 to jest 010, a powinno byc 0A, co nie ?
  • #16
    Rezystoreczek
    Level 20  
    Damian7546 wrote:
    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
    ienecode
    Level 21  
    -psiak- wrote:
    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 wrote:
    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
    -psiak-
    Level 32  
    Damian7546 wrote:
    Do 9 się zgadza, a juz 10 to jest 010, a powinno byc 0A, co nie ?
    OMG!
    Code: csharp
    Log in, to see the code
  • #19
    ienecode
    Level 21  
    hm, dalej konwertujesz z byte na hexa, a ja chciałem z stringa
  • #20
    Rezystoreczek
    Level 20  
    Damian7546 wrote:

    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):

    Code: csharp
    Log in, to see the code


    to samo dla wiekszej ilosci:


    Code: csharp
    Log in, to see the code


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

    Code: csharp
    Log in, to see the code


    Wpisuje do textboxa "textRej" wartość 10, i w labelu otrzymuje 16 .. a w hex to chyba A , co nie ?
  • #22
    Rezystoreczek
    Level 20  
    Podajesz 10 w hexie (czyli 1*16+0), czyli dziesietnie 16.

    To:

    Code: csharp
    Log in, to see the code


    zamienia na dec, wiec 16
    Natomiast to:
    Code: csharp
    Log in, to see the code

    na hex, wiec 10.

    oj, mylisz systemy, i stąd zamieszanie ;)
    Już wszystko jasne?
  • Helpful post
    #23
    -psiak-
    Level 32  
    @Damian7546 obejrzyj jak zadziała to:
    Code: csharp
    Log in, to see the code


    P.S.
    Damian7546 wrote:
    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:
    Code: csharp
    Log in, to see the code
  • #24
    ienecode
    Level 21  
    Rezystoreczek wrote:
    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!