byte[] to string i na odwrót

0

Witam
Mam pewien problem, który po części był już tutaj omawiany, ale nie dokładnie to co by mnie interesowało. Mianowicie potrzebuję w jednym miejscu programu zamienić tablicę bajtów na stringa, a następnie gdzie indziej tego stringa zamienić z powrotem na tablicę bajtów. Problem w tym, że po tych operacjach nie wychodzi tak samo. To co miałem na początku jako byte[] wygląda inaczej niż po zamianie. Nie wiem od czego to zależy.
Poniżej kawałek kodu:
tmp = ASCIIEncoding.ASCII.GetString(msg);//msg to tablica bajtów
byte[] buff = encoding.GetBytes(str);//System.Text.ASCIIEncoding encoding;

Proszę o pomoc, sam nie mam pomysłu dlaczego tak się dzieje.

0

ASCII to znaki zapisane jako liczby od 0 do 127. Dlatego jeżeli na wejściu podasz liczby z poza tego zakresu to otrzymasz liczbę 63 i to pewnie jest ta różnica którą zauważyłeś.

Oznacza to, że masz inaczej zakodowany tekst, może to być ANSI, UTF-8 albo jakiś inny format. Sprawdź w jakim kodowaniu masz tekst, który przetwarzasz.

0

Sprawdzalem u siebie przed chwila:

        String decoded;

        //z byte[] na string
        private void button1_Click(object sender, EventArgs e)
        {
            Byte[] bytes = new Byte[] {
             65,  83,  67,  73,  73,  32,  69,
            110,  99, 111, 100, 105, 110, 103,
             32,  69, 120,  97, 109, 112, 108, 101};
        

            ASCIIEncoding ascii = new ASCIIEncoding();
            decoded = ascii.GetString(bytes);

            textBox1.Text = decoded;
        }

        //z string na byte[]
        private void button2_Click(object sender, EventArgs e)
        {
            ASCIIEncoding ascii = new ASCIIEncoding();
            byte[] bajty = ascii.GetBytes(decoded);

            foreach (byte b in bajty)
            {
                textBox1.Text += b + " ";
            }
        }

Dokumentacja:
http://msdn.microsoft.com/en-us/library/38b953c8(VS.80).aspx#CommunityContent
http://msdn.microsoft.com/en-us/library/ds4kkd55(VS.80).aspx

0

Zmieniłem kodowanie na UTF8, ale dalej mam nieprawidłowości. Tzn. zamiast oryginalnej tablicy 8 bajtowej robi mi się na końcu tablica 7 bajtowa. Podam konkretny przykład. Muszę złożyć ramkę MODBUS z takich wartości: 1, 3, 1001, 55, i CRC rozbite na 2 bajty: 213, 172. Po złożeniu tablicy 8 bajtów wychodzi tak: [1,3,3,233,0,55,213,172]. Później przekładam to na string a potem znowu na bajty i wychodzi tablica 7 bajtowa: [1,3,3,0,55,213,172]. Jak widać brakuje 233 ale nie wiem dlaczego :(

0

Ale po co na string ? Nie wystarczą ci po po prostu bajty ? Co robisz z tym łańcuchem ?

A 233 brakuje bo UTF8 używasz, 233 jest w sąsiedztwie 0 i dlatego jest gubione. Nie każdy ciąg bajtów można sobie tak po prostu zamienić na dowolnie kodowany łańcuch. A jeżeli już to używaj kodowania jednobajtowego.

Najlepiej zamień sobie te bajty na hex-string to nie będzie problemów:

//na string
string hex_string = "";
foreach(byte b in bytes) hex_string += ((ubyte)b).ToString("X2");

//na bajty
int len = hex_string.Length / 2;
bytes = new byte[len];
for(int i = 0; i < len; i++) 
  bytes[i] = Byte.Parse(hex_string.Substring(2 * i, 2), NumberStyles.AllowHexSpecifier);
0

Rzeczywiście problem był w samym kodowaniu. Skorzystałem z unicode i już poprawnie zamienia.

Dzięki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1