El ile bir kodlama belirtmeden, C# 'daki dizgelerin tutarl─▒ bir bayt temsilini nas─▒l elde ederim?


Al─▒nan cevaba git


Nas─▒l d├Ân├╝┼čt├╝rebilirim string a byte[] el ile belirli kodlama belirtmeden .NET (C #) i├žinde?

Dizeyi ┼čifreleyece─čim. D├Ân├╝┼čt├╝rmeden ┼čifreleyebilirim, ancak neden kodlaman─▒n burada ├žalmaya geldi─čini bilmek istiyorum.

Ayr─▒ca, kodlama neden dikkate al─▒nmal─▒d─▒r? Dize hangi baytlar─▒n depoland─▒─č─▒n─▒ basit├že ├Â─črenemiyorum mu? Neden karakter kodlamas─▒na ba─č─▒ml─▒l─▒k var?


2107









Cevap say─▒s─▒n─▒ say: 30






Burada cevaplar─▒ aksine, kodlama hakk─▒nda endi┼če gerek YAPMAYIN e─čer bayt yorumlanabilir gerek yok!

Bahsetti─činiz gibi, hedefiniz basit├že, "dizginin depoland─▒─č─▒ baytlar─▒ almak" t─▒r .
(Ve tabii ki, dizgiyi baytlardan yeniden yap─▒land─▒rabilmek i├žin)

Bu hedefler i├žin d├╝r├╝st do not insanlar kodlamalar─▒ gerekti─čini belirten tutmak anlamak. Bunun i├žin kodlamalar konusunda endi┼čelenmenize kesinlikle gerek yok.

Bunun yerine sadece bunu yap─▒n:

 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;
}

// Do NOT use on arbitrary bytes; only use on GetBytes's output on the SAME system
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);
}
 

Program─▒n─▒z (veya di─čer programlar─▒n─▒z), yapmay─▒ d├╝┼č├╝nd├╝─č├╝n├╝zden a├ž─▒k├ža bahsetmedi─činiz baytlar─▒ bir ┼čekilde yorumlamaya ├žal─▒┼čmad─▒─č─▒ s├╝rece, bu yakla┼č─▒mda yanl─▒┼č bir ┼čey yoktur ! Kodlamalar konusunda endi┼čelenmek hayat─▒n─▒z─▒ ger├žek bir sebep olmadan daha karma┼č─▒k hale getiriyor.

Bu yakla┼č─▒m─▒n ek faydas─▒:

Dize ge├žersiz karakterler i├žerip i├žermedi─či ├Ânemli de─čildir, ├ž├╝nk├╝ verileri yine de alabilirsiniz ve orijinal dizeyi yine de yeniden yapabilirsiniz!

Ayn─▒ ┼čekilde kodlanacak ve kodlar─▒ ├ž├Âz├╝lecektir ├ž├╝nk├╝ sadece baytlara bak─▒yorsunuz .

Belirli bir kodlama kulland─▒ysan─▒z, ge├žersiz karakterleri kodlama / kod ├ž├Âzme konusunda size sorun ├ž─▒kar─▒rd─▒.


1813







Bu dizginin kodlamas─▒na ba─čl─▒d─▒r ( ASCII , UTF-8 , ...).

├ľrne─čin:

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

Kodlaman─▒n neden ├Ânemli oldu─čunu g├Âsteren k├╝├ž├╝k bir ├Ârnek:

 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 sadece ├Âzel karakterlerle ba┼ča ├ž─▒kmak i├žin donan─▒ml─▒ de─čildir.

Dahili olarak, .NET ├žer├ževesi dizeleri temsil etmek i├žin UTF-16'y─▒ kullan─▒r , bu nedenle sadece .NET'in kulland─▒─č─▒ tam baytlar─▒ almak istiyorsan─▒z kullan─▒n System.Text.Encoding.Unicode.GetBytes (...) .

Daha fazla bilgi i├žin .NET Framework'deki (MSDN) Karakter Kodlamas─▒ b├Âl├╝m├╝ne bak─▒n .


1092







Kabul edilen cevap ├žok, ├žok karma┼č─▒k. Bunun i├žin dahil edilen .NET s─▒n─▒flar─▒n─▒ kullan─▒n:

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

Gerekirse tekerle─či yeniden icat etme ...


274







 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());
 

110







Kodlamay─▒ hesaba katman─▒z gerekir, ├ž├╝nk├╝ 1 karakter 1 veya daha fazla byte (yakla┼č─▒k 6'ya kadar) ile temsil edilebilir ve farkl─▒ kodlamalar bu baytlar─▒ farkl─▒ ┼čekilde ele al─▒r.

Joel bu konuda bir ilan─▒ var:

Mutlak Minimum Her Yaz─▒l─▒m Geli┼čtiricisi Kesinlikle, Unicode ve Karakter K├╝meleri Hakk─▒nda Bilmeniz Gerekenler (Mazeret Yok!)


92







Bu pop├╝ler bir soru. Soru yazar─▒n─▒n ne sordu─čunu ve bunun en yayg─▒n ihtiya├ž olan ┼čeyden farkl─▒ oldu─čunu anlamak ├Ânemlidir. ─░htiya├ž duyulmad─▒─č─▒nda kodun k├Ât├╝ye kullan─▒lmas─▒n─▒ ├Ânlemek i├žin daha sonra cevaplad─▒m.

Ortak ihtiya├ž

Her dizgenin bir karakter seti ve kodlamas─▒ vard─▒r. Bir System.String nesneyi bir diziye d├Ân├╝┼čt├╝rd├╝─č├╝n├╝zde System.Byte hala bir karakter k├╝mesi ve kodlamas─▒ vard─▒r. ├ço─ču kullan─▒mda, hangi karakter k├╝mesine ve kodlamaya ihtiyac─▒n─▒z oldu─čunu bilirsiniz ve .NET, "d├Ân├╝┼č├╝mle kopyalamay─▒" kolayla┼čt─▒r─▒r. Sadece uygun Encoding s─▒n─▒f─▒ se├žin .

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

D├Ân├╝┼č├╝m├╝n, hedef karakter k├╝mesinin veya kodlaman─▒n kaynakta bulunan bir karakteri desteklemedi─či durumlar─▒ ele almas─▒ gerekebilir. Baz─▒ se├ženekleriniz var: istisna, yerine koyma veya atlama. Varsay─▒lan politika bir '?' Yerine koymakt─▒r.

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

A├ž─▒k├žas─▒, d├Ân├╝┼č├╝mler mutlaka kay─▒ps─▒z de─čildir!

Not: System.String Kaynak karakter k├╝mesi i├žin Unicode'dur.

Tek kafa kar─▒┼čt─▒ran ┼čey, .NET'in o karakter k├╝mesinin belirli bir kodlamas─▒n─▒n ad─▒ i├žin bir karakter k├╝mesinin ad─▒n─▒ kullanmas─▒d─▒r. Encoding.Unicode aranmal─▒ Encoding.UTF16 .

├ço─ču kullan─▒m i├žin bu kadar. ─░htiyac─▒n olan buysa, burada okumay─▒ b─▒rak. Kodlaman─▒n ne oldu─čunu anlam─▒yorsan─▒z , e─členceli Joel Spolsky makalesine bak─▒n .

├ľzel ihtiya├ž

┼×imdi, soru yazar─▒, ÔÇťHer dize bir bayt dizisi olarak saklan─▒r, de─čil mi? Neden sadece bu baytlara sahip olam─▒yorum?ÔÇŁ Diye soruyor.

D├Ân├╝┼č├╝m istemiyor.

G├Ânderen C # spec :

C # ile karakter ve string i┼čleme Unicode kodlamas─▒n─▒ kullan─▒r. Karakter t├╝r├╝ bir UTF-16 kod birimini ve dizi t├╝r├╝ bir UTF-16 kod birimi dizisini temsil eder.

├ľyleyse, bo┼ča d├Ân├╝┼č├╝m istiyorsak (├Ârne─čin, UTF-16'dan UTF-16'ya), istenen sonucu elde edece─čimizi biliyoruz:

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

Ancak kodlamalardan ka├ž─▒nmak i├žin ba┼čka bir yolla yapmal─▒y─▒z. Bir ara veri tipi kabul edilebilir ise, bunun i├žin kavramsal bir k─▒sayol vard─▒r:

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

Bu bize istenilen veri t├╝r├╝ almaz ama Mehrdad cevab─▒ g├Âsterileri nas─▒l kullanarak bir bayt dizisi i├žin bu Char dizi d├Ân├╝┼čt├╝rmek i├žin BlockCopy . Ancak, bu dize iki kez kopyalar! Ve ayr─▒ca, a├ž─▒k├ža kodlamaya ├Âzg├╝ kodu kullan─▒r: veri t├╝r├╝ System.Char .

String'in depoland─▒─č─▒ ger├žek baytlara ula┼čman─▒n tek yolu bir i┼čaret├ži kullanmakt─▒r. Bu fixed ifade, de─čerlerin adresinin al─▒nmas─▒na izin verir. C # spec'tan:

[String] t├╝r├╝nde bir ifade i├žin, ... ba┼člat─▒c─▒, dizedeki ilk karakterin adresini hesaplar.

Bunu yapmak i├žin, derleyici, kod nesnesinin dize nesnesinin di─čer b├Âl├╝mlerine atlayarak kod yazar RuntimeHelpers.OffsetToStringData . B├Âylece, ham baytlar─▒ almak i├žin, sadece dizeye bir i┼čaret├ži olu┼čturun ve gereken bayt say─▒s─▒n─▒ kopyalay─▒n.

 // using System.Runtime.InteropServices
unsafe byte[] GetRawBytes(String s)
{
    if (s == null) return null;
    var codeunitCount = s.Length;
    /* We know that String is a sequence of UTF-16 codeunits 
       and such codeunits are 2 bytes */
    var byteCount = codeunitCount * 2; 
    var bytes = new byte[byteCount];
    fixed(void* pRaw = s)
    {
        Marshal.Copy((IntPtr)pRaw, bytes, 0, byteCount);
    }
    return bytes;
}
 

@CodesInChaos'un i┼čaret etti─či gibi, sonu├ž, makinenin t├╝rl├╝─č├╝ne ba─čl─▒d─▒r. Ancak soru yazar─▒ bununla ilgilenmiyor.


86







Sorunuzun ilk k─▒sm─▒ (baytlar─▒n nas─▒l al─▒naca─č─▒) ba┼čkalar─▒ taraf─▒ndan zaten yan─▒tland─▒: System.Text.Encoding ad alan─▒na bak─▒n.

Takip eden sorunuzu ele alaca─č─▒m: neden bir kodlama se├žmeniz gerekiyor? Neden bunu string s─▒n─▒f─▒n─▒n kendisinden alam─▒yorsun?

Cevap iki b├Âl├╝mden olu┼čuyor.

Her ┼čeyden ├Ânce, dize s─▒n─▒f─▒ taraf─▒ndan dahili olarak kullan─▒lan baytlar─▒n ├Ânemi yoktur ve ne zaman yapt─▒klar─▒n─▒ varsayarsan─▒z bir hata ile kar┼č─▒la┼č─▒rs─▒n─▒z.

Program─▒n─▒z tamamen .Net d├╝nyas─▒ndaysa, bir a─č ├╝zerinden veri g├Ânderiyor olsan─▒z bile, dizeler i├žin bayt dizileri alma konusunda endi┼čelenmenize gerek yoktur. Bunun yerine, veri iletimi konusunda endi┼čelenmek i├žin .Net Seri hale getirme kullan─▒n. Art─▒k ger├žek baytlar i├žin endi┼čelenmeyin: Seri hale getirme bi├žimlendirici bunu sizin i├žin yapar.

├ľte yandan, bu baytlar─▒ bir .Net serile┼čtirilmi┼č ak─▒┼č─▒ndan veri alaca─č─▒n─▒ garanti edemeyece─činiz bir yere g├Ânderiyorsan─▒z ne olur? Bu durumda kesinlikle kodlama konusunda endi┼čelenmeniz gerekir, ├ž├╝nk├╝ a├ž─▒k├žas─▒ bu harici sistem ├Ânemsiyor. Yine, dizge taraf─▒ndan kullan─▒lan dahili baytlar─▒n ├Ânemi yoktur: bir kodlama se├žmeniz gerekir, b├Âylece al─▒c─▒ taraf─▒ndan bu kodlama hakk─▒nda a├ž─▒k olabilirsiniz, hatta dahili olarak .NET taraf─▒ndan kullan─▒lan ayn─▒ kodlama olsa bile.

Bu durumda, m├╝mk├╝nse bellekte string de─či┼čkeni taraf─▒ndan saklanan ger├žek byte'lar─▒ kullanmay─▒ tercih edebilece─činizi, bayt ak─▒┼č─▒n─▒z─▒ yaratan baz─▒ i┼čleri kurtarabilece─čini d├╝┼č├╝nerek anl─▒yorum. Ancak, bu emin ├ž─▒k─▒┼č di─čer ucunda anla┼č─▒lmaktad─▒r hale k─▒yasla sadece ├Ânemli de─čil, ve o garantiye size koymak gerekir kodlamayla ilgili a├ž─▒k ve net olmas─▒. Ek olarak, dahili baytlar─▒n─▒zla ger├žekten e┼čle┼čmek istiyorsan─▒z, zaten sadece Unicode kodlamay─▒ se├žebilir ve bu performans tasarrufunu elde edebilirsiniz.

Hangi toplama ... ─░kinci b├Âl├╝mde getiriyor Unicode kodlamay─▒ edilir yatan byte kullanarak .NET anlatan. Bu kodlamay─▒ se├žmeniz gerekir, ├ž├╝nk├╝ baz─▒ yeni ├ž─▒km─▒┼č Unicode-Plus'lar ├ž─▒kt─▒─č─▒nda .Net ├žal─▒┼čma zaman─▒, program─▒n─▒z─▒ bozmadan daha yeni ve daha iyi kodlama modelini kullanmak i├žin ├╝cretsiz olmal─▒d─▒r. Ancak, ┼ču an i├žin (ve yak─▒n gelecekte), yaln─▒zca Unicode kodlamas─▒n─▒ se├žmek, istedi─činiz ┼čeyi verir.

Ayr─▒ca, dizginizin kabloya yeniden yaz─▒lmas─▒ gerekti─čini ve e┼čle┼čen bir kodlama kullan─▒yor olsan─▒z bile en az─▒ndan bit deseninin ├ževrilmesini i├žeren anlamak ├Ânemlidir . Bilgisayar─▒n, Little vs Little Endian, a─č bayt s─▒ras─▒, paketleme, oturum bilgileri vb. Gibi ┼čeyleri hesaba katmas─▒ gerekir.


44







Sadece Mehrdrad ses g├Âstermek i├žin cevap eserler, onun yakla┼č─▒m─▒ bile devam edebilir e┼čle┼čmemi┼č yedek karakterlerini bir├žok cevab─▒m hakk─▒nda ├Âne s├╝rd├╝─č├╝ olan (fakat bunlardan herkes ├Ârne─čin ayn─▒ derecede su├žludur System.Text.Encoding.UTF8.GetBytes , System.Text.Encoding.Unicode.GetBytes ; bu kodlama y├Ântemleri y├╝ksek suret devam edemez d800 ├ľrne─čin, karakterleri sadece y├╝ksek vekil karakterlerin yerine sadece de─čer koyun 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);
    }        
}
 

Çıktı:

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

System.Text.Encoding.UTF8.GetBytes veya System.Text.Encoding.Unicode.GetBytes ile deneyin , yaln─▒zca y├╝ksek vekil karakterleri fffd de─čeriyle de─či┼čtirirler

Her ne zaman bu soruda bir hareket varsa, hala e┼čle┼čtirilmemi┼č yedek karakterler i├žerdi─činde dizeleri s├╝rd├╝rebilen bir serile┼čtirici (Microsoft'tan veya 3. parti bile┼čeninden) d├╝┼č├╝n├╝yorum; Her ┼čimdi ve sonra bunu google: seri hale getirme e┼členmemi┼č vekil karakter . Bu beni uykuyu kaybetmeme zorla┼čt─▒rmaz, ama her zaman ve her ne zaman birileri can s─▒k─▒c─▒ bir yorumda bulunurken cevaplar─▒ma kusurlu oldu─čunu s├Âyleyen birileri var, ancak cevaplar─▒ e┼čle┼čtirilmemi┼č yedek karakterler s├Âz konusu oldu─čunda cevaplar─▒ e┼čit derecede hatal─▒.

Lanet, Microsoft sadece kullan─▒lm─▒┼č olmal─▒d─▒r System.Buffer.BlockCopy onun i├žinde BinaryFormatter Ńâä

Ŕ░óŔ░ó!


43







Bunu dene, ├žok daha az kod:

 System.Text.Encoding.UTF8.GetBytes("TEST String");
 

39







┼×ey, b├╝t├╝n cevaplar─▒ okudum ve onlar kodlanmam─▒┼č ya da e┼členmemi┼č ta┼č─▒y─▒c─▒lar─▒ b─▒rakan serile┼čtirme hakk─▒nda bir tane kullan─▒yorlard─▒.

├ľrne─čin, dizenin, ├Ârne─čin bir parola hash─▒n─▒ depolayan bir bayt dizisinden olu┼čturuldu─ču SQL Server'dan gelmesi k├Ât├╝ . Ondan bir ┼čey b─▒rak─▒rsak, ge├žersiz bir karma depolar ve XML'de saklamak istiyorsak bozulmadan b─▒rakmak isteriz (├ž├╝nk├╝ XML yaz─▒c─▒s─▒ buldu─ču e┼členmemi┼č herhangi bir vekilde istisna b─▒rakmaktad─▒r).

Bu y├╝zden bu t├╝r durumlarda byte dizilerinin Base64 kodlamas─▒n─▒ kullan─▒yorum , ancak hey, internette C # 'da bunun i├žin tek bir ├ž├Âz├╝m var, ve i├žinde hata var ve sadece tek bir yol var, bu y├╝zden hatay─▒ d├╝zelttim ve geri yazd─▒m prosed├╝r. ─░┼čte, gelecekteki ├žal─▒┼čanlar:

 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);
}
 

25


2011-03-10





Ayr─▒ca kodlaman─▒n neden dikkate al─▒nmas─▒ gerekti─čini de a├ž─▒klay─▒n─▒z. Dize hangi baytlar─▒n depoland─▒─č─▒n─▒ basit├že ├Â─črenemiyorum mu? Neden bu kodlamaya ba─č─▒ml─▒l─▒k? !!!

├ç├╝nk├╝ "dizginin bayt─▒" diye bir ┼čey yoktur.

Bir dize (veya daha genel olarak bir metin) karakterlerden olu┼čur: harfler, rakamlar ve di─čer semboller. Bu kadar. Ancak bilgisayarlar karakterler hakk─▒nda hi├žbir ┼čey bilmezler; sadece baytlar─▒ kullanabilirler. Bu nedenle, bir bilgisayar kullanarak metin depolamak veya iletmek istiyorsan─▒z, karakterleri baytlara d├Ân├╝┼čt├╝rmeniz gerekir. Bunu nas─▒l yapt─▒n? ─░┼čte kodlamalar─▒n ger├žekle┼čti─či yer.

Kodlama, mant─▒ksal karakterleri fiziksel baytlara ├ževirmenin bir kural─▒ d─▒┼č─▒nda bir ┼čey de─čildir. En basit ve en iyi bilinen kodlama ASCII'dir ve ─░ngilizce yaz─▒yorsan─▒z ihtiyac─▒n─▒z olan tek ┼čey budur. Di─čer diller i├žin, bug├╝nlerde en g├╝venli se├žim olan Unicode tatlar─▒ndan herhangi biri olarak daha eksiksiz kodlamaya ihtiyac─▒n─▒z olacak.

Yani, k─▒sacas─▒, "kodlama kullanmadan bir dizginin baytlar─▒n─▒ almak" i├žin ├žal─▒┼čmak, "herhangi bir dil kullanmadan bir metin yazmak" kadar m├╝mk├╝n de─čildir.

Bu arada, sizi (ve bu konuda kimseye) bu k├╝├ž├╝k bilgeli─či okuman─▒z─▒ ┼čiddetle tavsiye ediyorum: Mutlak Minimum Her Yaz─▒l─▒m Geli┼čtiricisi Kesinlikle, Olumlu Olarak Unicode ve Karakter K├╝meleri Bilmeli (Mazeret Yok!)


23







string Bir byte diziye d├Ân├╝┼čt├╝rmek i├žin C # :

 public static byte[] StrToByteArray(string str)
{
   System.Text.UTF8Encoding  encoding=new System.Text.UTF8Encoding();
   return encoding.GetBytes(str);
}
 

22







Dize ve bayt dizisi aras─▒nda d├Ân├╝┼č├╝m i├žin a┼ča─č─▒daki kodu kullanabilirsiniz.

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

17







 byte[] strToByteArray(string str)
{
    System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
    return enc.GetBytes(str);
}
 

16







Span<T> C # 7.2 ile yay─▒mlanan ortaya ├ž─▒kmas─▒yla, bir dizenin alt─▒nda yatan bellek g├Âsterimini y├Ânetilen bir bayt dizisine yakalamak i├žin kullan─▒lan kanonik teknik ┼č├Âyledir:

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

Onu geri d├Ân├╝┼čt├╝rmek, ba┼člat─▒c─▒ olmamal─▒d─▒r, ├ž├╝nk├╝ bu asl─▒nda verileri bir ┼čekilde yorumlad─▒─č─▒n─▒z anlam─▒na gelir, ancak tamamlanma u─čruna:

 string s;
unsafe
{
    fixed (char* f = &bytes.AsSpan().NonPortableCast<byte, char>().DangerousGetPinnableReference())
    {
        s = new string(f);
    }
}
 

─░simler NonPortableCast ve DangerousGetPinnableReference muhtemelen bunu yapmaman─▒z gerekti─či arg├╝man─▒n─▒ i├žermelidir.

Bununla ├žal─▒┼čman─▒n System.Memory NuGet paketinin Span<T> kurulmas─▒n─▒ gerektirdi─čini unutmay─▒n .https://www.nuget.org/packages/System.Memory

Ne olursa olsun, as─▒l orijinal soru ve takip yorumlar─▒, temel haf─▒zan─▒n ÔÇťyorumlanmad─▒─č─▒n─▒ÔÇŁ (yani, demek istedi─čim anlam─▒na geldi─či anlam─▒na gelmedi─čini, de─či┼čtirilmedi─čini ya da okunmad─▒─č─▒n─▒) belirtir, bu da Stream s─▒n─▒f─▒n baz─▒ uygulamalar─▒n─▒n yap─▒ld─▒─č─▒n─▒ g├Âsterir. Veriler hakk─▒nda ak─▒l y├╝r├╝tmek yerine, dizge olarak kullan─▒lmal─▒d─▒r.


14







Emin de─čilim, ancak dizginin bilgisini bayt ile verimsiz olan bir Karakter dizisi olarak saklad─▒─č─▒n─▒ d├╝┼č├╝n├╝yorum. Spesifik olarak, Char tan─▒m─▒ "Unicode karakterini temsil eder" dir.

bu ├Ârnek ├Ârne─či al:

 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));
}
 

Unicode cevab─▒n─▒n her iki durumda da 14 bayt oldu─čuna dikkat edin, UTF-8 cevab─▒ ise birincisi i├žin sadece 9 byte, ikincisi i├žin de sadece 7'dir.

Yani sadece dizenin kulland─▒─č─▒ baytlar─▒ istiyorsan─▒z, sadece kullan─▒n Encoding.Unicode , fakat depolama alan─▒ ile verimsiz olacakt─▒r.


13







├ľnemli olan konu, bir dizgede bulunan bir glifin 32 bit (karakter kodu i├žin 16 bit) almas─▒d─▒r ancak bir bayt─▒n yaln─▒zca 8 biti olmas─▒ gerekir. Kendinizi yaln─▒zca ASCII karakterleri i├žeren dizelerle k─▒s─▒tlamad─▒─č─▒n─▒z s├╝rece bire bir e┼čleme yap─▒lmaz. System.Text.Encoding, bir dizgiyi bayt [] ile e┼člemenin bir├žok yoluna sahiptir; bilgi kayb─▒n─▒ ├Ânleyen ve bayt [] '─▒ bir dizeye e┼člemesi gerekti─činde m├╝┼čteriniz taraf─▒ndan kullanmas─▒ kolay olan─▒ se├žmeniz gerekir. .

Utf8 pop├╝ler bir kodlamad─▒r, kompakt ve kay─▒pl─▒ de─čildir.


11







kullan─▒n:

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

Sonu├ž:

 [0] = 115
[1] = 116
[2] = 114
[3] = 105
[4] = 110
[5] = 103
 

9







En h─▒zl─▒ yol

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

Makotosan'─▒n EDIT yapt─▒─č─▒ yorumun bu ┼čimdi en iyi yol:

 Encoding.UTF8.GetBytes(text)
 

8







Belirli bir kodlamay─▒ manuel olarak belirtmeden .NET'te (C #) bir dizgiyi bayt [] 'a nas─▒l d├Ân├╝┼čt├╝rebilirim?

.NET'te bir dize , metni UTF-16 kod birimleri dizisi olarak g├Âsterir, bu nedenle baytlar zaten UTF-16'da bellekte kodlanm─▒┼čt─▒r.

Mehrdad'─▒n Cevab─▒

Mehrdad'─▒n cevab─▒n─▒ kullanabilirsiniz , ancak karakter kodlar─▒ UTF-16 oldu─čundan kodlama kullan─▒yor. Kayna─ča bakarak hangi kayna─č─▒ olu┼čturan ToCharArray'i ├ža─č─▒r─▒r char[] ve belle─či do─črudan kendisine kopyalar. Daha sonra verileri ayr─▒ca tahsis edilen bir bayt dizisine kopyalar. Bu y├╝zden kaputun alt─▒nda, alttaki baytlar─▒ iki kez kopyal─▒yor ve ├ža─čr─▒dan sonra kullan─▒lmayan bir karakter dizisi ay─▒r─▒yor.

Tom Blodget Cevap

Tom Blodget'in cevab─▒ Mehrdad'dan % 20-30 daha h─▒zl─▒ ├ž├╝nk├╝ bir karakter dizisi ay─▒rma ve byte'lar─▒ kopyalamaya aradaki ad─▒m─▒ atl─▒yor, ancak bu /unsafe se├žene─či derlemenizi gerektiriyor . E─čer kesinlikle kodlama kullanmak istemiyorsan─▒z, bence bu yoldur. ┼×ifreleme giri┼č bilgilerinizi fixed blo─čun i├žine koyarsan─▒z, ayr─▒ bir bayt dizisi ay─▒rman─▒za ve baytlar─▒ kopyalaman─▒za bile gerek kalmaz.

Ayr─▒ca, kodlama neden dikkate al─▒nmal─▒d─▒r? Dize hangi baytlar─▒n depoland─▒─č─▒n─▒ basit├že ├Â─črenemiyorum mu? Neden karakter kodlamas─▒na ba─č─▒ml─▒l─▒k var?

├ç├╝nk├╝ bunu yapman─▒n do─čru yolu budur. string bir soyutlamad─▒r.

Bir kodlaman─▒n kullan─▒lmas─▒, ge├žersiz karakterli 'dizeler' varsa sorun ├ž─▒kartabilir, ancak bu olmamal─▒d─▒r. Ge├žersiz karakterlerle dizginize veri al─▒yorsan─▒z, yanl─▒┼č yap─▒yorsunuz demektir. Muhtemelen ba┼člamak i├žin bir bayt dizisi veya Base64 kodlamas─▒ kullan─▒yor olmal─▒s─▒n─▒z.

Kullan─▒rsan─▒z System.Text.Encoding.Unicode , kodunuz daha dayan─▒kl─▒ olacakt─▒r. Kodunuzun ├žal─▒┼čaca─č─▒ sistemin endikasyonu hakk─▒nda endi┼čelenmenize gerek yok . CLR'nin bir sonraki s├╝r├╝m├╝n├╝n farkl─▒ bir dahili karakter kodlamas─▒ kullanmas─▒ durumunda endi┼čelenmenize gerek yok.

Bence soru neden kodlama konusunda endi┼čelenmek istemedi─činizi de─čil, neden g├Ârmezden gelip ba┼čka bir ┼čey kullanmak istedi─činizi d├╝┼č├╝n├╝yorum. Kodlaman─▒n, bayt dizisindeki bir dizgenin soyutlamas─▒n─▒ temsil etmesi ama├žlanm─▒┼čt─▒r. System.Text.Encoding.Unicode size k├╝├ž├╝k bir endian bayt s─▒ras─▒ kodlamas─▒ verecek ve ┼čimdi ve gelecekte her sistemde ayn─▒ i┼člemi ger├žekle┼čtirecektir.


8







OP'nin sorusuna en yak─▒n yakla┼č─▒m, asl─▒nda nesneye giren ve baytlar─▒ ├ž─▒karan Tom Blodget'inkidir. Ben en yak─▒n diyorum ├ž├╝nk├╝ bu String Nesnesinin uygulanmas─▒na ba─čl─▒.

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

Tabii, ama sorudaki temel hatan─▒n ortaya ├ž─▒kt─▒─č─▒ yer buras─▒d─▒r. Dize, ilgin├ž bir veri yap─▒s─▒na sahip olabilecek bir nesnedir. Bunu zaten biliyoruz, ├ž├╝nk├╝ e┼čle┼čtirilmemi┼č ta┼č─▒y─▒c─▒lar─▒n saklanmas─▒na izin veriyor. Uzunlu─ču saklayabilir. H─▒zl─▒ sayma imkan─▒ sa─člayan 'e┼čle┼čtirilmi┼č' vekillerin her birine i┼čaret edebilir. Vb Bu ekstra baytlar─▒n t├╝m├╝ karakter verilerinin bir par├žas─▒ de─čildir.

─░stedi─činiz ┼čey, bir dizideki her karakterin bayt─▒d─▒r. Ve 'kodlaman─▒n' geldi─či yer buras─▒d─▒r. Varsay─▒lan olarak UTF-16LE'yi al─▒rs─▒n─▒z. Gidi┼č-d├Ân├╝┼č hari├ž baytlar─▒n kendileri umrunda de─čilse, 'varsay─▒lan' da dahil olmak ├╝zere herhangi bir kodlamay─▒ se├žebilir ve daha sonra geri d├Ân├╝┼čt├╝rebilirsiniz (varsay─▒lan kodlaman─▒n ne oldu─ču gibi ayn─▒ parametreleri varsayarak, kod noktalar─▒, hata d├╝zeltmeleri e┼čle┼čmemi┼č suretler vb. gibi ┼čeylere izin verilir.

Ama neden 'kodlamay─▒' b├╝y├╝ye b─▒rak─▒yorsun? Niye alaca─č─▒n─▒z─▒ bilmek i├žin neden kodlamay─▒ belirtmiyorsunuz?

 "Why is there a dependency on character encodings?"
 

Kodlama (bu ba─člamda) sadece dizenizi temsil eden bayt anlam─▒na gelir. String nesnesinin baytlar─▒ de─čil. Dizenin i├žinde bulundu─ču baytlar─▒ istediniz - bu, sorunun saf olarak soruldu─ču yerdi. Bir dize nesnesinin i├žerebilece─či di─čer ikili verilerin t├╝m├╝n├╝ de─čil, dizeyi temsil eden biti┼čik bir dizide dizenin bayt olmas─▒n─▒ istediniz.

Bu, bir dizenin nas─▒l sakland─▒─č─▒ anlam─▒na gelmez. Bir bayt dizisindeki baytlara "Kodlanm─▒┼č" bir dize istiyorsunuz.

Tom Bloget'in cevab─▒n─▒ be─čendim ├ž├╝nk├╝ sizi 'string nesnesinin bayt' y├Ân├╝ne g├Ât├╝rd├╝. Yine de uygulamaya ba─čl─▒ ve i├ž organlara g├Âz att─▒─č─▒ i├žin dizenin bir kopyas─▒n─▒ yeniden olu┼čturmak zor olabilir.

Mehdad'─▒n tepkisi yanl─▒┼čt─▒r ├ž├╝nk├╝ kavramsal d├╝zeyde yan─▒lt─▒c─▒d─▒r. Hala kodlanm─▒┼č bir bayt listeniz var. ├ľzel ├ž├Âz├╝m├╝, e┼čle┼čtirilmemi┼č ta┼č─▒y─▒c─▒lar─▒n korunmas─▒n─▒ sa─člar - bu uygulamaya ba─čl─▒d─▒r. ├ľzel ├ž├Âz├╝m├╝, dize GetBytes varsay─▒lan olarak UTF-8'de d├Ând├╝r├╝l├╝rse dizenin baytlar─▒n─▒ do─čru ┼čekilde ├╝retmez .


Bu konuda fikrimi de─či┼čtirdim (Mehrdad'─▒n ├ž├Âz├╝m├╝) - bu dizginin bayt─▒n─▒ alm─▒yor; bunun yerine, dizeden yarat─▒lan karakter dizisinin baytlar─▒n─▒ al─▒yor. Kodlamaya bak─▒lmaks─▒z─▒n, c # i├žindeki char veri t├╝r├╝ sabit bir boyuttur. Bu, tutarl─▒ bir uzunluk bayt dizisinin ├╝retilmesine izin verir ve karakter dizisinin bayt dizisinin boyutuna ba─čl─▒ olarak ├žo─čalt─▒lmas─▒n─▒ sa─člar. Yani kodlama UTF-8 olsayd─▒, ancak her karakter en b├╝y├╝k utf8 de─čerine uymas─▒ i├žin 6 bayt olsayd─▒, yine de ├žal─▒┼č─▒rd─▒. Yani ger├žekten - karakterin kodlanmas─▒ ├Ânemli de─čil.

Fakat bir d├Ân├╝┼č├╝m kullan─▒ld─▒ - her karakter sabit b├╝y├╝kl├╝kte bir kutuya yerle┼čtirildi (c # karakter tipi). Bununla birlikte, bu temsilin ├Ânemi yoktur, teknik olarak OP'nin cevab─▒ budur. Yani - yine de d├Ân├╝┼čt├╝recekseniz ... Neden 'kodlam─▒yorsunuz'?


7







Bir d├Ân├╝┼čt├╝rmek i├žin a┼ča─č─▒daki kodu kullanabilirsiniz string bir etmek byte array .NET i├žinde

 string s_unicode = "abc├ęabc";
byte[] utf8Bytes = System.Text.Encoding.UTF8.GetBytes(s_unicode);
 

6







Bir dizginin alt─▒ndaki baytlar─▒n─▒n ger├žekten bir kopyas─▒n─▒ istiyorsan─▒z, izleyen gibi bir i┼člevi kullanabilirsiniz. Ancak, nedenini bulmak i├žin l├╝tfen okumamal─▒s─▒n─▒z.

 [DllImport(
        "msvcrt.dll",
        EntryPoint = "memcpy",
        CallingConvention = CallingConvention.Cdecl,
        SetLastError = false)]
private static extern unsafe void* UnsafeMemoryCopy(
    void* destination,
    void* source,
    uint count);

public static byte[] GetUnderlyingBytes(string source)
{
    var length = source.Length * sizeof(char);
    var result = new byte[length];
    unsafe
    {
        fixed (char* firstSourceChar = source)
        fixed (byte* firstDestination = result)
        {
            var firstSource = (byte*)firstSourceChar;
            UnsafeMemoryCopy(
                firstDestination,
                firstSource,
                (uint)length);
        }
    }

    return result;
}
 

Bu i┼člev, dizenizin alt─▒ndaki baytlar─▒n bir kopyas─▒n─▒ olduk├ža ├žabucak al─▒r. Bu baytlar─▒, sisteminizde hangi ┼čekilde kodlad─▒klar─▒n─▒ al─▒rs─▒n─▒z. Bu kodlama neredeyse kesinlikle UTF-16LE'dir ancak bu, dikkat etmeniz gerekmeyen bir uygulama detay─▒d─▒r.

Bu olaca─č─▒n─▒ daha g├╝venli, daha basit ve daha g├╝venilir adil ├ža─čr─▒s─▒na,

 System.Text.Encoding.Unicode.GetBytes()
 

Herhalde bu ayn─▒ sonucu verecek, yazmas─▒ daha kolay ve baytlar her zaman bir ├ža─čr─▒ ile bir araya gelecek

 System.Text.Encoding.Unicode.GetString()
 

3







─░┼čte d├Ân├╝┼č├╝m String i├žin g├╝vensiz uygulama Byte[] :

 public static unsafe Byte[] GetBytes(String s)
{
    Int32 length = s.Length * sizeof(Char);
    Byte[] bytes = new Byte[length];

    fixed (Char* pInput = s)
    fixed (Byte* pBytes = bytes)
    {
        Byte* source = (Byte*)pInput;
        Byte* destination = pBytes;

        if (length >= 16)
        {
            do
            {
                *((Int64*)destination) = *((Int64*)source);
                *((Int64*)(destination + 8)) = *((Int64*)(source + 8));

                source += 16;
                destination += 16;
            }
            while ((length -= 16) >= 16);
        }

        if (length > 0)
        {
            if ((length & 8) != 0)
            {
                *((Int64*)destination) = *((Int64*)source);

                source += 8;
                destination += 8;
            }

            if ((length & 4) != 0)
            {
                *((Int32*)destination) = *((Int32*)source);

                source += 4;
                destination += 4;
            }

            if ((length & 2) != 0)
            {
                *((Int16*)destination) = *((Int16*)source);

                source += 2;
                destination += 2;
            }

            if ((length & 1) != 0)
            {
                ++source;
                ++destination;

                destination[0] = source[0];
            }
        }
    }

    return bytes;
}
 

Oldu─ču kadar zarif olmasa bile, kabul g├Ârm├╝┼č olan─▒nkinden ├žok daha h─▒zl─▒. ─░┼čte 10000000'in ├╝zerinde yineleme kronometre kriterlerim:

 [Second String: Length 20]
Buffer.BlockCopy: 746ms
Unsafe: 557ms

[Second String: Length 50]
Buffer.BlockCopy: 861ms
Unsafe: 753ms

[Third String: Length 100]
Buffer.BlockCopy: 1250ms
Unsafe: 1063ms
 

Kullanmak i├žin, proje olu┼čturma ├Âzelliklerinde "G├╝vensiz Kodlara ─░zin Ver" i i┼čaretlemelisiniz. .NET Framework 3.5'e g├Âre, bu y├Ântem String uzant─▒s─▒ olarak da kullan─▒labilir:

 public static unsafe class StringExtensions
{
    public static Byte[] ToByteArray(this String s)
    {
        // Method Code
    }
}
 

3







─░ki yol:

 public static byte[] StrToByteArray(this string s)
{
    List<byte> value = new List<byte>();
    foreach (char c in s.ToCharArray())
        value.Add(c.ToByte());
    return value.ToArray();
}
 

Ve,

 public static byte[] StrToByteArray(this string s)
{
    s = s.Replace(" ", string.Empty);
    byte[] buffer = new byte[s.Length / 2];
    for (int i = 0; i < s.Length; i += 2)
        buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
    return buffer;
}
 

En alttan bir tanesini daha s─▒k kullanmaya meyilliyim, h─▒z i├žin k─▒yaslama yapmad─▒m.


2


2009-02-19





 bytes[] buffer = UnicodeEncoding.UTF8.GetBytes(string something); //for converting to UTF then get its bytes

bytes[] buffer = ASCIIEncoding.ASCII.GetBytes(string something); //for converting to ascii then get its bytes
 

2







LINQ ile basit kod

 string s = "abc"
byte[] b = s.Select(e => (byte)e).ToArray();
 

EDIT: a┼ča─č─▒da yorumland─▒─č─▒ gibi, iyi bir yol de─čil.

ancak daha uygun bir kodlamayla LINQ'u anlamak i├žin hala kullanabilirsiniz:

 string s = "abc"
byte[] b = s.Cast<byte>().ToArray();
 

2







Basit├že ┼čunu kullan─▒n:

 byte[] myByte= System.Text.ASCIIEncoding.Default.GetBytes(myString);
 

2







Dize, a┼ča─č─▒daki ger├žeklerden dolay─▒, birka├ž farkl─▒ yolla bayt dizisine d├Ân├╝┼čt├╝r├╝lebilir: .NET, Unicode'u destekler ve Unicode, UTF olarak adland─▒r─▒lan birka├ž fark kodlamas─▒n─▒ standartla┼čt─▒r─▒r. Farkl─▒ uzunluklarda bayt temsilleri vard─▒r ancak bu, bir dize kodland─▒─č─▒nda, dizeye geri kodlanabilece─či anlam─▒na gelir, ancak dize bir UTF ile kodlanm─▒┼čsa ve vidalanabiliyorsa, farkl─▒ UTF varsay─▒m─▒na g├Âre kodlanm─▒┼čsa yukar─▒.

Ayr─▒ca, .NET Unicode olmayan kodlamalar─▒ da destekler, ancak bunlar genel olarak ge├žerli de─čildir (yaln─▒zca ASCII gibi ger├žek bir dizgide s─▒n─▒rl─▒ bir Unicode kod noktas─▒ alt k├╝mesi kullan─▒ld─▒─č─▒nda ge├žerli olacakt─▒r). Dahili olarak, .NET UTF-16'y─▒ destekler, ancak ak─▒┼č g├Âsterimi i├žin UTF-8 genellikle kullan─▒l─▒r. Ayn─▒ zamanda internet i├žin standart bir y├Ântemdir.

┼×a┼č─▒rt─▒c─▒ olmayan bir ┼čekilde, dizginin bir bayt dizisine seri hale getirilmesi ve seriyi kald─▒rma, System.Text.Encoding soyut bir s─▒n─▒f olan s─▒n─▒f taraf─▒ndan desteklenir ; t├╝retilmi┼č s─▒n─▒flar─▒ somut kodlamalar─▒ destekler: ASCIIEncoding ve d├Ârt System.Text.UnicodeEncoding UTF ( UTF-16'y─▒ destekler)

Bu ba─člant─▒y─▒ ref .

Kullanarak bir bayt dizisine serile┼čtirme i├žin System.Text.Encoding.GetBytes . Ters i┼člem i├žin kullan─▒n System.Text.Encoding.GetChars . Bu i┼člev bir karakter dizisi d├Ând├╝r├╝r, bir dize almak i├žin bir dize yap─▒c─▒s─▒ kullan─▒n System.String(char[]) .
Sayfay─▒ ref.

├ľrnek:

 string myString = //... some string

System.Text.Encoding encoding = System.Text.Encoding.UTF8; //or some other, but prefer some UTF is Unicode is used
byte[] bytes = encoding.GetBytes(myString);

//next lines are written in response to a follow-up questions:

myString = new string(encoding.GetChars(bytes));
byte[] bytes = encoding.GetBytes(myString);
myString = new string(encoding.GetChars(bytes));
byte[] bytes = encoding.GetBytes(myString);

//how many times shall I repeat it to show there is a round-trip? :-)
 

2







Bu baytlar─▒n ne istedi─čine ba─čl─▒d─▒r

Bunun nedeni, Tyler'─▒n ├žok a├ž─▒k bir ┼čekilde s├Âyledi─či gibi , "Dizeler saf veri de─čil. Ayr─▒ca bilgiye de sahipler ." Bu durumda, bilgi dize olu┼čturuldu─čunda varsay─▒lan bir kodlamad─▒r.

Bir dizede saklanan ikili verilerinizin (metin yerine) oldu─čunu varsayarsak

Bu OP'nin kendi sorusundaki yorumuna dayanmaktad─▒r ve OP'nin kullan─▒mdaki ipu├žlar─▒n─▒ anl─▒yorsam do─čru soru.

─░kili veriyi dizgelerde saklamak muhtemelen yukar─▒da bahsedilen kodlaman─▒n yanl─▒┼č olmas─▒ nedeniyle yanl─▒┼č bir yakla┼č─▒md─▒r! Hangi ikili programda depolanan herhangi bir program veya k├╝t├╝phane string ( byte[] daha uygun olan bir dizi yerine ) zaten ba┼člamadan ├Ânce sava┼č─▒ kaybetti. Baytlar─▒ size bir REST iste─činde / yan─▒t─▒nda veya dizeleri iletmesi gereken herhangi bir ┼čeyde g├Ânderiyorlarsa, Base64 do─čru yakla┼č─▒m olacakt─▒r.

Bilinmeyen bir kodlamaya sahip bir metin dizeniz varsa

Di─čer herkes bu yanl─▒┼č soruyu yanl─▒┼č cevaplad─▒.

Dize oldu─ču gibi iyi g├Âr├╝n├╝yorsa, sadece bir kodlama se├žin (tercihen UTF ile ba┼člayan), kar┼č─▒l─▒k gelen System.Text.Encoding.???.GetBytes() i┼člevi kullan─▒n ve se├žti─činiz kodu hangi baytlara verdi─činizi s├Âyleyin.


2


2017-11-08