Kaip gauti nuoseklią baitų seką C #, nenurodant rankiniu būdu kodavimo?

Kaip konvertuoti string į byte[] į .NET (С #), nenurodant konkretaus kodavimo rankiniu būdu?

Aš užšifruosiu eilutę. Aš galiu jį užšifruoti be konvertavimo, bet vis tiek norėčiau sužinoti, kodėl čia prasideda kodavimas.

Be to, kodėl reikėtų apsvarstyti kodavimą? Ar galiu gauti tik tai, ką baitas įrašo į eilutę? Kodėl priklauso nuo simbolių kodavimo?

2003 m
23 янв. nustatė Agnel Kurian , sausio 23 d 2009-01-23 16:39 '09 16:39 2009-01-23 16:39
@ 38 atsakymai
  • 1
  • 2

Skirtingai nei čia pateikti atsakymai, jums nereikia nerimauti dėl kodavimo, nebent baitai turi būti aiškinami!

Kaip minėjote, jūsų tikslas yra tiesiog „gauti, ką baitai saugomi eilutėje“.
(Ir, žinoma, kad galėtumėte atkurti baitų eilutę.)

Šiais tikslais aš sąžiningai nesuprantu, kodėl žmonės nuolat sako, kad jums reikia kodavimo. Jūs tikrai neturite jaudintis dėl kodavimo.

Tiesiog atlikite tai:

 static byte[] GetBytes(string str) { byte[] bytes = new byte[str.Length * sizeof(char)]; System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); return bytes; } static string GetString(byte[] bytes) { char[] chars = new char[bytes.Length / sizeof(char)]; System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length); return new string(chars); } 

Kol jūsų programa (ar kitos programos) nesistengs kažkaip interpretuoti baitų, kuriuos akivaizdžiai nepaminėjote, ketinate tai daryti, tada nėra nieko tokio požiūrio! Susirūpinimas dėl kodavimo tiesiog apsunkina jūsų gyvenimą be jokios realios priežasties.

Papildomas pranašumas šiam metodui:

Nesvarbu, ar eilutėje yra netinkamų simbolių, nes vis tiek galite gauti duomenis ir atkurti pradinę eilutę!

Jis bus koduojamas ir dekoduojamas tuo pačiu būdu, nes jūs tiesiog žiūrite į baitus.

Jei naudojote konkretų kodavimą, tai gali sukelti problemų dėl netinkamų simbolių kodavimo / dekodavimo.

1765 m
30 апр. Mehrdado atsakymas, pateiktas balandžio 30 d 2012-04-30 10:44 '12, 10:44, 2012-04-30 10:44

Tai priklauso nuo jūsų eilutės kodavimo ( ASCII , UTF-8 , ...).

Pavyzdžiui:

 byte[] b1 = System.Text.Encoding.UTF8.GetBytes (myString); byte[] b2 = System.Text.Encoding.ASCII.GetBytes (myString); 

Nedidelis pavyzdys, kodėl kodavimas reikalingas:

border=0
 string pi = "\u03a0"; byte[] ascii = System.Text.Encoding.ASCII.GetBytes (pi); byte[] utf8 = System.Text.Encoding.UTF8.GetBytes (pi); Console.WriteLine (ascii.Length); //Will print 1 Console.WriteLine (utf8.Length); //Will print 2 Console.WriteLine (System.Text.Encoding.ASCII.GetString (ascii)); //Will print '?' 

ASCII paprasčiausiai nėra aprūpintas specialiais simboliais.

NET naudoja UTF-16, kad atstovautų stygos, taigi, jei norite tiesiog gauti tikslius baitus, kuriuos naudoja .NET, naudokite System.Text.Encoding.Unicode.GetBytes (...) .

Norėdami gauti daugiau informacijos, žr. Simbolių kodavimas .NET Framework (MSDN).

1066
23 янв. Atsakymą pateikė bmotmans sausio 23 d 2009-01-23 16:43 '09 ne 16:43 2009-01-23 16:43

Priimtas atsakymas yra labai sunkus. Tam naudokite įtrauktas .NET klases:

 const string data = "A string with international characters: Norwegian: ÆØÅæøå, Chinese: 喂 谢谢"; var bytes = System.Text.Encoding.UTF8.GetBytes(data); var decoded = System.Text.Encoding.UTF8.GetString(bytes); 

Nereikia išradinėti rato, jei nereikia ...

260
30 апр. Atsakyti Erik A. Brandstadmoen 30 Bal 2012-04-30 10:26 '12 10:26 AM 2012-04-30 10:26
 BinaryFormatter bf = new BinaryFormatter(); byte[] bytes; MemoryStream ms = new MemoryStream(); string orig = "喂 Hello 谢谢 Thank You"; bf.Serialize(ms, orig); ms.Seek(0, 0); bytes = ms.ToArray(); MessageBox.Show("Original bytes Length: " + bytes.Length.ToString()); MessageBox.Show("Original string Length: " + orig.Length.ToString()); for (int i = 0; i < bytes.Length; ++i) bytes[i] ^= 168; // pseudo encrypt for (int i = 0; i < bytes.Length; ++i) bytes[i] ^= 168; // pseudo decrypt BinaryFormatter bfx = new BinaryFormatter(); MemoryStream msx = new MemoryStream(); msx.Write(bytes, 0, bytes.Length); msx.Seek(0, 0); string sx = (string)bfx.Deserialize(msx); MessageBox.Show("Still intact :" + sx); MessageBox.Show("Deserialize string Length(still intact): " + sx.Length.ToString()); BinaryFormatter bfy = new BinaryFormatter(); MemoryStream msy = new MemoryStream(); bfy.Serialize(msy, sx); msy.Seek(0, 0); byte[] bytesy = msy.ToArray(); MessageBox.Show("Deserialize bytes Length(still intact): " + bytesy.Length.ToString()); 
107
23 янв. Atsakymą pateikė Michael Buen , sausio 23 d 2009-01-23 19:36 '09 19:36 2009-01-23 19:36

Turite atsižvelgti į kodavimą, nes 1 simbolis gali būti pateikiamas 1 arba daugiau baitų (iki 6), o skirtingi kodai apdoros šiuos baitus skirtingai.

Joel turi laidų:

Absoliutus minimumas Kiekvienas programinės įrangos kūrėjas Absoliučiai teigiamai reikia žinoti apie Unicode ir simbolių rinkinius (be pasiteisinimų!)

84
23 янв. Zhaph - Ben Duguid atsakymas, sausio 23 d 2009-01-23 17:03 '09, 17:03, 2009-01-23 17:03

Tai populiarus klausimas. Svarbu suprasti, ką autorius klausia, ir kad jis skiriasi nuo dažniausiai pasitaikančio poreikio. Kad būtų išvengta piktnaudžiavimo kodu, kurio nereikia, atsakiau vėliau.

Bendras poreikis

Kiekvienoje eilutėje yra simbolių rinkinys ir kodavimas. Konvertuodami „ System.String objektą į System.Byte masyvą, vis dar turite simbolių rinkinį ir simbolių rinkinį. Daugeliu atvejų jums reikia žinoti, kokį simbolių rinkinį ir kodavimą jums reikia, ir .NET palengvina „išversti į konversiją“. Tiesiog pasirinkite tinkamą Encoding klasę.

 // using System.Text; Encoding.UTF8.GetBytes(".NET String to byte array") 

Konversijai gali tekti tvarkyti atvejus, kai tikslinis simbolių rinkinys arba kodavimas nepalaiko šaltinio esančio simbolio. Turite pasirinkimą: išimtis, pakeitimas arba praleidimai. Numatytoji politika yra pakeisti „?“.

 // using System.Text; var text = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes("You win €100")); // -> "You win ?100" 

Akivaizdu, kad konversija nebūtinai yra be nuostolių!

Pastaba „ System.String pradinis simbolių rinkinys yra Unicode.

Vienintelis nesuprantamas dalykas yra tai, kad .NET naudoja simbolių rinkinio pavadinimą vieno konkretaus šio simbolių rinkinio kodavimo vardui. Encoding.Unicode turėtų būti vadinamas Encoding.UTF16 .

Kas tai yra daugeliui papročių. Jei reikia, nustokite skaityti čia. Žr . Joel Spolsky straipsnio straipsnį, jei nesuprantate, koks yra kodavimas.

Ypatingas poreikis

Dabar klausėjas klausia: „Kiekviena eilutė saugoma kaip baitų masyvas, tiesa? Kodėl aš negaliu tiesiog turėti šių baitų?“

Jis nenori konversijos.

Nuo C # spec :

„C #“ simbolių ir styginių tvarkymas naudoja Unicode kodavimą. Charakterijos tipas yra UTF-16 kodo blokas, o eilutės tipas yra UTF-16 kodų blokų seka.

Taigi žinome, kad jei prašysime nulinės konversijos (ty nuo UTF-16 iki UTF-16), gauname norimą rezultatą:

 Encoding.Unicode.GetBytes(".NET String to byte array") 

Tačiau norint išvengti kodavimo paminėjimo, turime tai daryti kitaip. Jei tarpinis duomenų tipas yra galiojantis, tai yra koncepcijos etiketė:

 ".NET String to byte array".ToCharArray() 

Tai nesuteikia mums norimo duomenų tipo, tačiau „ Mehrdad Response“ rodo, kaip šią „Char“ masyvą paversti baitų masyvu naudojant „ BlockCopy“ . Tačiau jis du kartus nukopijuoja eilutę! Ir per daug aiškiai naudojamas kodavimo kodas: duomenų tipas yra System.Char .

Vienintelis būdas gauti faktinį baitą, kuriame saugoma eilutė, yra naudoti rodyklę. fixed pareiškimas leidžia priimti vertybių adresą. Iš C # specifikacijos:

[For] tipo eilutės išraiška ... iniciatorius apskaičiuoja eilutės pirmojo simbolio adresą.

Norėdami tai padaryti, kompiliatorius rašo kodą, kuris perduoda kitas eilutės objekto dalis naudodamas „ RuntimeHelpers.OffsetToStringData . Taigi, norėdami gauti neapdorotus baitus, tiesiog sukurkite žymiklį į eilutę ir nukopijuokite reikiamą baitų skaičių.

 // using System.Runtime.InteropServices unsafe byte[] GetRawBytes(String s) { if (s == null) return null; var codeunitCount = s.Length;  var byteCount = codeunitCount * 2; var bytes = new byte[byteCount]; fixed(void* pRaw = s) { Marshal.Copy((IntPtr)pRaw, bytes, 0, byteCount); } return bytes; } 

Kaip pažymėjo @CodesInChaos, rezultatas priklauso nuo mašinos tikslumo. Tačiau klausimo autorius nėra suinteresuotas.

79
02 дек. Atsakymą pateikė Tom Blodget 02 Dec. 2013-12-02 07:43 '13, 7:43 2013-12-02 07:43

Pirmąją jūsų klausimo dalį (kaip gauti baitus) jau atsakė kiti: ieškokite „ System.Text.Encoding vardų erdvėje.

Aš apsvarstysiu jūsų kitą klausimą: kodėl jums reikia pasirinkti koduotę? Kodėl negalite to gauti iš pačios eilutės klasės?

Atsakymą sudaro dvi dalys.

Visų pirma, eilutės klasės baitai yra nesvarbūs, ir, jei manote, kad taip yra, galite įvesti klaidą.

Jei jūsų programa yra visiškai .Net pasaulyje, jums nereikės nerimauti dėl baitų matricų visoms eilėms, net jei siunčiate duomenis per tinklą. Vietoj to naudokite .Net Serialization, kad nerimautumėte duomenų perdavimo. Jūs nebėra nerimauti dėl faktinių baitų: Serializacijos formatas jums tinka.

Kita vertus, kas, jei siunčiate šiuos baitus kažkur, kad negalite garantuoti, kad duomenys bus gauti iš .Net serializuoto srauto? Tokiu atveju jums tikrai reikia nerimauti dėl kodavimo, nes, žinoma, ši išorinė sistema rūpinasi. Taigi eilutės naudojami vidiniai baitai neturi reikšmės: reikia pasirinkti kodavimą, kad galėtumėte aiškiai nurodyti šį kodavimą priimančioje pusėje, net jei jis naudoja tą patį kodavimą, kuris naudojamas .Net viduje.

Suprantu, kad tokiu atveju galbūt norėsite naudoti faktinius baitus, išsaugotus eilutės kintamajame atmintyje, jei įmanoma, su idėja, kad jis gali išsaugoti tam tikrą darbą, sukurdamas baitų srautą. Vis dėlto manau, kad tai nėra svarbu, palyginti su tuo, kad įsitikintumėte, jog jūsų produkcija yra suprantama kitame gale, ir užtikrinti, kad jūs turite būti aiškiai su savo kodavimu. Be to, jei tikrai norite sujungti savo vidinius baitus, jau galite tiesiog pasirinkti Unicode kodavimą ir sutaupyti.

Kas veda prie antrosios dalies ... pasirenkant Unicode kodavimą sako .Net naudoti bazinius baitus. Jums reikia pasirinkti šį kodavimą, nes kai pasirodys naujas „Unicode-Plus“, „Net runtime“ turi būti laisvas, kad galėtumėte naudoti šį naują, geresnį kodavimo modelį nepažeidžiant jūsų programos. Bet šiuo metu (ir ateityje) paprasčiausiai pasirenkant Unicode koduotę, galite tai, ko norite.

Taip pat svarbu suprasti, kad jūsų eilutė turi būti perrašyta į laidą, ir tai reiškia bent šiek tiek bitų modelio vertimą, net jei naudojate tinkamą kodavimą. Kompiuteris turėtų apsvarstyti tokius dalykus kaip „Big vs Little Endian“, tinklo baito tvarką, pakuotę, sesijos informaciją ir kt.

39
23 янв. Joel Coehoorn atsakymas, sausio 23 d 2009-01-23 18:54 '09, 18:54, 2009-01-23 18:54

Tiesiog norėdami parodyti, kad „Mehrdrado“ gera reakcija veikia, jo požiūris gali netgi išsaugoti nesusijusius pakaitinius simbolius (kurių daugelis išlygino mano atsakymą, tačiau visi yra vienodai kalti, pavyzdžiui, „ System.Text.Encoding.UTF8.GetBytes . System.Text.Encoding.Unicode.GetBytes System.Text.Encoding.UTF8.GetBytes , System.Text.Encoding.Unicode.GetBytes , šie kodavimo metodai negali išsaugoti senesnių pakaitinių simbolių d800 , bet tiesiog pakeisti senesnius pakaitinius simbolius reikšme fffd ):

 using System; class Program { static void Main(string[] args) { string t = "爱虫"; string s = "Test\ud800Test"; byte[] dumpToBytes = GetBytes(s); string getItBack = GetString(dumpToBytes); foreach (char item in getItBack) { Console.WriteLine("{0} {1}", item, ((ushort)item).ToString("x")); } } static byte[] GetBytes(string str) { byte[] bytes = new byte[str.Length * sizeof(char)]; System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); return bytes; } static string GetString(byte[] bytes) { char[] chars = new char[bytes.Length / sizeof(char)]; System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length); return new string(chars); } } 

Išeiti:

 T 54 e 65 s 73 t 74 ? d800 T 54 e 65 s 73 t 74 

Pabandykite tai su System.Text.Encoding.UTF8.GetBytes arba System.Text.Encoding.Unicode.GetBytes , jie paprasčiausiai pakeis senesnius pakaitinius simbolius reikšme fffd

Kiekvieną kartą, kai šiuo klausimu vyksta judėjimas, vis dar galvoju apie serializatorių (ar tai būtų iš „Microsoft“, ar iš trečiosios šalies komponento), kuris gali išsaugoti eilutes, net jei jame yra nesusiję pakaitiniai simboliai; Kartais kartoju „ Google“: nesusijęs pakaitinis .NET simbolis . Tai nereiškia, kad prarasiu miego, bet tai šiek tiek erzina, kai kartais kažkas komentuoja mano atsakymą, kad jis neteisingas, bet jų atsakymai yra netobulūs, kai kalbama apie nesusijusius pakaitinius simbolius.

Pragaras, „Microsoft“ turėjo tiesiog naudoti „ System.Buffer.BlockCopy “ savo „ BinaryFormatter

谢谢!

38
30 апр. Atsakymą pateikė Michael Buen , balandžio 30 d 2012-04-30 15:50 '12, 15:50, 2012-04-30 15:50

Pabandykite tai, daug mažiau kodo:

 System.Text.Encoding.UTF8.GetBytes("TEST String"); 
36
26 июля '11 в 1:52 2011-07-26 01:52 atsakymą pateikė Nathanas liepos 26 d. 11 d. 1:52 2011-07-26 01:52

Na, aš perskaičiau visus atsakymus, ir jie kalbėjo apie kodavimo ar serializacijos naudojimą, kuris išmeta nesusijusius pakaitalus.

Tai blogai, kai eilutė, pavyzdžiui, yra iš SQL serverio , kur ji buvo pastatyta iš baitų masyvo, pvz., Slaptažodžio maišos. Jei atsisakysime nieko iš jo, ji išsaugos negaliojančią maišą ir, jei norime ją išsaugoti XML, mes norime ją palikti nepaliestą (nes XML rašytojas pašalina išimtį dėl bet kokio nesuderinto pakaitalo, kurį jis nustato).

Todėl tokiais atvejais aš naudoju „ Base64 “ baitų matricų kodavimą, tačiau internetas turi tik vieną sprendimą C #, ir jame yra klaida, ir tai tik vienas būdas, todėl pataisiau klaidą ir atlikiau įrašymo procedūrą. Čia esate, būsimi „Google“ naudotojai:

 public static byte[] StringToBytes(string str) { byte[] data = new byte[str.Length * 2]; for (int i = 0; i < str.Length; ++i) { char ch = str[i]; data[i * 2] = (byte)(ch  0xFF); data[i * 2 + 1] = (byte)((ch  0xFF00) >> 8); } return data; } public static string StringFromBytes(byte[] arr) { char[] ch = new char[arr.Length / 2]; for (int i = 0; i < ch.Length; ++i) { ch[i] = (char)((int)arr[i * 2] + (((int)arr[i * 2 + 1]) << 8)); } return new String(ch); } 
22
10 марта '11 в 11:57 2011-03-10 11:57 atsakymą pateikė Gmanas kovo 11 d. 11 val. 11:57 2011-03-10 11:57

Taip pat paaiškinkite kodėl reikia atsižvelgti į kodavimą. Ar galiu gauti tik tai, ką baitas įrašo į eilutę? Kodėl ši priklausomybė nuo kodavimo? !!!

Kadangi nėra tokio dalyko kaip „eilutės baitai“.

Stygą (arba daugiau bendrojo teksto) sudaro simboliai: raidės, skaičiai ir kiti simboliai. Visa tai. Tačiau kompiuteriai nieko nežino apie simbolius; jie gali tvarkyti tik baitus. Todėl, jei norite išsaugoti ar perkelti tekstą naudodami kompiuterį, turite konvertuoti simbolius į baitus. Kaip tai darote? Čia, kai kodai ateina į sceną.

Kodavimas - tai tik susitarimas paversti loginius simbolius į fizinius baitus. Paprasčiausias ir garsiausias kodavimas yra ASCII, ir tai yra viskas, ko jums reikia, jei rašote anglų kalba. Kitoms kalboms jums reikės išsamesnių kodų, nes bet kuris „Unicode“ yra pats saugiausias pasirinkimas šiuo metu.

Taigi, trumpai tariant, bandymas „gauti eilutės baitus nenaudojant kodavimo“ yra lygiai taip pat neįmanomas kaip „teksto rašymas nenaudojant jokios kalbos“.

Beje, aš labai rekomenduoju jums (ir visiems, kad šiuo klausimu) perskaityti šį mažą išminties gabalą: Absoliutus minimalus Kiekvienas programinės įrangos kūrėjas Absoliučiai, teigiamai reikia žinoti apie Unicode ir simbolių rinkinius (be pasiteisinimų!)

20
16 июля '09 в 14:45 2009-07-16 14:45 atsakymą Konamimanas pateikė liepos 10 d. , 09:45 , 2009-07-16 14:45

C #, jei norite konvertuoti string masyvą į byte :

 public static byte[] StrToByteArray(string str) { System.Text.UTF8Encoding encoding=new System.Text.UTF8Encoding(); return encoding.GetBytes(str); } 
19
05 июня '13 в 13:52 2013-06-05 13:52 atsakymą pateikė Shyam sundar shah birželio 05 d. 13:52 2013-06-05 13:52
 byte[] strToByteArray(string str) { System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); return enc.GetBytes(str); } 
15
23 янв. atsakymas, kurį pateikė gkrogers Jan 23 2009-01-23 16:43 '09 ne 16:43 2009-01-23 16:43

Galite naudoti šį kodą konvertuoti tarp styginių ir baitų masyvo.

 string s = "Hello World"; // String to Byte[] byte[] byte1 = System.Text.Encoding.Default.GetBytes(s); // OR byte[] byte2 = System.Text.ASCIIEncoding.Default.GetBytes(s); // Byte[] to string string str = System.Text.Encoding.UTF8.GetString(byte1); 
15
09 сент. Atsakymą pateikė Jarvis Stark 09 rugsėjis 2014-09-09 14:30 '14, 14:30, 2014-09-09 14:30

Aš nesu įsitikinęs, bet manau, kad eilutė išlaiko savo informaciją kaip „Chars“, kuri yra neveiksminga baitais, masyvas. Visų pirma, „Char“ apibrėžimas reiškia „Atstovauja Unicode“.

Paimkite šį pavyzdį:

 String str = "asdf éß"; String str2 = "asdf gh"; EncodingInfo[] info = Encoding.GetEncodings(); foreach (EncodingInfo enc in info) { System.Console.WriteLine(enc.Name + " - " + enc.GetEncoding().GetByteCount(str) + enc.GetEncoding().GetByteCount(str2)); } 

Atkreipkite dėmesį, kad Unicode atsakas yra 14 baitų abiem atvejais, o UTF-8 atsakas yra tik 9 baitai pirmajam ir tik 7 - antrajam.

Taigi, jei tiesiog norite naudoti eilutės naudojamus baitus, naudokite Encoding.Unicode , bet jis bus neefektyvus su atminties kiekiu.

11
23 янв. atsakymą pateikė Ed Marty sausio 23 d 2009-01-23 17:34 '09, 17:34 2009-01-23 17:34

Pagrindinė problema yra ta, kad eilutės glifas trunka 32 bitus (16 bitų simbolių kodui), tačiau baitas turi tik 8 bitus. Individualus atitikimas neegzistuoja, nebent apribojate tik eilutes, kuriose yra tik ASCII simboliai. „System.Text.Encoding“ turi daug būdų, kaip susieti eilutę su baitu [], turite pasirinkti tą, kuris leidžia išvengti informacijos praradimo ir kurį klientas gali lengvai naudoti, kai ji turi suderinti baitą [] atgal į eilutę.

Utf8 yra populiarus kodavimas, kompaktiškas ir neprarandantis.

10
23 янв. Hans Passant atsakymas Jan 23 2009-01-23 17:15 '09 17:15 pm 2009-01-23 17:15

Su Span<T> pasirodymu išleistas C # 7.2, kanoninis metodas pagrindinio atminties reprezentacijos įrašymui į valdomą baito masyvą:

 byte[] bytes = "rubbish_\u9999_string".AsSpan().AsBytes().ToArray(); 

Konvertavimas atgal turėtų būti sudėtingas, nes tai reiškia, kad jūs iš tikrųjų interpretuojate duomenis kažkaip, bet dėl ​​išsamumo:

 string s; unsafe { fixed (char* f =  char>().DangerousGetPinnableReference()) { s = new string(f); } } 

NonPortableCast ir „ DangerousGetPinnableReference “ pavadinimai turėtų turėti argumentą „ NonPortableCast , kurį tikriausiai neturėtumėte daryti.

Atkreipkite dėmesį, kad norint dirbti su „ Span<T> reikia įdiegti „System.Memory NuGet“ paketą .

Nepaisant to, faktinis šaltinio klausimas ir vėlesni komentarai reiškia, kad pagrindinė atmintis nėra „aiškinama“ (kuri, manau, reiškia, kad ji nėra pakeista ir neskaityta, nebent ji yra parašyta taip), kuri rodo tam tikrą Stream įgyvendinimą klasė turėtų būti naudojama vietoj argumentų apie duomenis kaip stygos apskritai.

8
10 янв. Atsakymą pateikė John Rasch 10 sausis 2018-01-10 23:21 '18, 11:21 val. 2018-01-10 23:21

Naudoti:

  string text = "string"; byte[] array = System.Text.Encoding.UTF8.GetBytes(text); 

Rezultatas:

 [0] = 115 [1] = 116 [2] = 114 [3] = 105 [4] = 110 [5] = 103 
7
22 окт. atsakymas duotas mashet 22 okt. 2013-10-22 15:55 '13, 15:55, 2013-10-22 15:55

Greičiausias būdas

 public static byte[] GetBytes(string text) { return System.Text.ASCIIEncoding.UTF8.GetBytes(text); } 

PAKEITIMAS, kaip komentavo Makotosanas, dabar tai yra geriausias būdas:

 Encoding.UTF8.GetBytes(text) 
7
22 марта '10 в 11:40 2010-03-22 11:40 atsakymas pateikiamas „ Sunrising“ kovo 22 d. 10 val. 11.40 2010-03-22 11:40

Artimiausias požiūris į OP klausimą yra Tom Blodget, kuris iš tikrųjų patenka į objektą ir ištraukia baitus. Aš kalbu arčiau, nes tai priklauso nuo styginių objekto įgyvendinimo.

 "Can't I simply get what bytes the string has been stored in?" 

Žinoma, bet kai yra esminė klaida. Styga yra objektas, galintis turėti įdomią duomenų struktūrą. Mes jau žinome, kad taip atsitinka todėl, kad leidžia jums saugoti nesusijusius pakaitinius. Jis gali laikyti ilgį. Jame gali būti rodyklė į kiekvieną „suporuotą“ pakaitalą, leidžianti greitai apskaičiuoti. Ir taip toliau Visi šie papildomi baitai nėra simbolių duomenų dalis.

Ką norite, kad kiekvienas simbolių baitas būtų matricoje. И именно здесь происходит "кодирование". По умолчанию вы получите UTF-16LE. Если вы сами не заботитесь о самих байтах, за исключением поездки туда и обратно, вы можете выбрать любую кодировку, включая "по умолчанию", и преобразовать ее позже (при условии, что те же параметры, что и кодировка по умолчанию, кодовые точки, исправления ошибок, разрешенные вещи, такие как непарные суррогаты и т.д.