Mam byte[]
tablicę, która jest ładowana z pliku, o którym wiadomo, że zawiera UTF-8 .
W kodzie do debugowania muszę przekonwertować go na ciąg. Czy istnieje jeden liniowiec, który to zrobi?
Pod przykrywkami powinien to być tylko przydział i memcopy , więc nawet jeśli nie zostanie wdrożony, powinno być możliwe.
Odpowiedzi:
źródło
System.Text.Encoding.UTF8.GetString(buf).TrimEnd('\0');
.Istnieją co najmniej cztery różne sposoby wykonania tej konwersji.
Kodowanie GetString
, ale nie będziesz w stanie odzyskać oryginalnych bajtów, jeśli te bajty zawierają znaki spoza ASCII.
BitConverter.ToString
Dane wyjściowe są ciągiem rozdzielanym znakami „-”, ale nie ma wbudowanej metody .NET umożliwiającej konwersję ciągu z powrotem na tablicę bajtów.
Convert.ToBase64String
Za pomocą można łatwo przekonwertować ciąg wyjściowy z powrotem na tablicę bajtów
Convert.FromBase64String
.Uwaga: Łańcuch wyjściowy może zawierać „+”, „/” i „=”. Jeśli chcesz użyć ciągu w adresie URL, musisz go jawnie zakodować.
HttpServerUtility.UrlTokenEncode
Za pomocą można łatwo przekonwertować ciąg wyjściowy z powrotem na tablicę bajtów
HttpServerUtility.UrlTokenDecode
. Łańcuch wyjściowy jest już przyjazny dla adresu URL! Minusem jest to, że wymagaSystem.Web
montażu, jeśli Twój projekt nie jest projektem internetowym.Pełny przykład:
źródło
var decBytes2 = str.Split('-').Select(ch => Convert.ToByte(ch, 16)).ToArray();
Ogólne rozwiązanie do konwersji z tablicy bajtów na ciąg znaków, gdy nie znasz kodowania:
źródło
Definicja:
Za pomocą:
źródło
Konwersja a
byte[]
nastring
wydaje się prosta, ale jakiekolwiek kodowanie może zepsuć łańcuch wyjściowy. Ta niewielka funkcja działa bez żadnych nieoczekiwanych rezultatów:źródło
Korzystanie
(byte)b.ToString("x2")
, dane wyjścioweb4b5dfe475e58b67
źródło
Istnieje również klasa UnicodeEncoding, dość prosta w użyciu:
źródło
UnicodeEncoding
jest najgorszą nazwą klasy w historii; Unicode w ogóle nie jest kodowaniem. Ta klasa to tak naprawdę UTF-16. Myślę, że wersja Little-Endian.Alternatywnie:
źródło
Jednowierszowy Linq do konwertowania tablicy bajtów
byteArrFilename
odczytanej z pliku na ciąg znaków zerowych zakończony zerowym stylem czystego ascii w stylu C byłby następujący: Przydatny do odczytu takich rzeczy jak tabele indeksów plików w starych formatach archiwów.Używam
'?'
jako domyślnego znaku dla wszystkiego, co nie jest czystym ascii, ale można to oczywiście zmienić. Jeśli chcesz mieć pewność, że możesz to wykryć, po prostu użyj'\0'
zamiast tego, ponieważTakeWhile
na początku zapewnia, że zbudowany w ten sposób łańcuch nie może zawierać'\0'
wartości ze źródła wejściowego.źródło
BitConverter
klasa może być użyta do konwersjibyte[]
nastring
.Dokumentację
BitConverter
klasy można znaleźć w MSDNźródło
Według mojej wiedzy żadna z podanych odpowiedzi nie gwarantuje poprawnego zachowania z zerowym zakończeniem. Dopóki ktoś nie pokaże mi inaczej, napisałem własną klasę statyczną do obsługi tego za pomocą następujących metod:
Powodem tego
startIndex
był przykład, nad którym konkretnie pracowałem, musiałem przeanalizowaćbyte[]
jako tablicę ciągów zakończonych zerem. W prostym przypadku można go bezpiecznie zignorowaćźródło
byteArr.TakeWhile(x => x != 0)
to szybki i łatwy sposób rozwiązania problemu zerowego zakończenia.hier to wynik, w którym nie trzeba się martwić kodowaniem. Użyłem go w mojej klasie sieciowej i wysyłałem z nim obiekty binarne jako ciąg znaków.
źródło
Oprócz wybranej odpowiedzi, jeśli używasz .NET35 lub .NET35 CE, musisz określić indeks pierwszego bajtu do zdekodowania oraz liczbę bajtów do zdekodowania:
źródło
Wypróbuj tę aplikację konsoli:
źródło
Widziałem kilka odpowiedzi w tym poście i można uznać, że jest to podstawowa wiedza, ponieważ istnieje kilka podejść do programowania w języku C #, aby rozwiązać ten sam problem. Jedyną rzeczą, którą należy wziąć pod uwagę, jest różnica między Pure UTF-8 i UTF-8 z BOM .
W zeszłym tygodniu, w mojej pracy, muszę opracować jedną funkcję, która wyprowadza pliki CSV z BOM i inne CSV z czystym UTF-8 (bez BOM), każdy typ kodowania pliku CSV będzie wykorzystywany przez różne niestandardowe interfejsy API, ten jeden API odczytuje UTF-8 z BOM, a drugi API odczytuje bez BOM. Muszę zbadać odniesienia do tej koncepcji, czytając „ Jaka jest różnica między UTF-8 a UTF-8 bez BOM? ” Dyskusja o przepełnieniu stosu i link do Wikipedii „ Znak kolejności bajtów ”, aby zbudować moje podejście.
Wreszcie, moje programowanie w C # dla obu typów kodowania UTF-8 (z BOM i czystym) musiało być podobne, jak w poniższym przykładzie:
źródło