Czy pytasz, ile pamięci stringzajmuje obiekt lub ile bajtów zajmie reprezentacja ciągu, gdy zostanie zapisana do pliku lub przesłana przez sieć (tj. Zakodowana), ponieważ są to dwa zupełnie różne pytania. majidgeek prawie odpowiedział na pierwsze, a diya na drugie (przynajmniej dla dwóch wspólnych kodowań).
@AllonGuralnek: Słuszna uwaga. czy wiesz, dlaczego diya poniżej nie zasugerowała użycia System.Text.Encoding.Unicode.GetByteCount? Dlaczego część ASCIIEncoding?
giorgim
@Giorgi: Ponieważ Unicodejest statyczną właściwością programu System.Text.Encoding, która jest klasą bazową ASCIIEncoding, obie instrukcje są w rzeczywistości takie same. Możesz również uzyskać dostęp do statycznego elementu członkowskiego z podklas (ale nie jest to uważane za idiomatyczne).
Allon Guralnek
Odpowiedzi:
132
Możesz użyć kodowania, takiego jak ASCII, aby uzyskać znak na bajt za pomocą System.Text.Encodingklasy.
Głupie pytanie, ale skąd będziemy wiedzieć, czy użyć klasy Unicode czy ASCII, jeśli dane w ciągu pochodzą z pliku strony trzeciej?
Matthew Lock
7
@MatthewLock Powinieneś użyć UTF16 (lub majidgeeka Length * sizeof(Char), który powinien dać ten sam wynik, ponieważ każdy Charma wartość UTF16 / 2-bajtowe), jeśli chcesz mieć taką samą liczbę bajtów, jak wewnętrzna reprezentacja łańcucha. Jeśli faktycznie chcesz mieć dokładną ilość pamięci, jaką zajmuje cały obiekt, a nie tylko liczbę bajtów w jego wewnętrznej tablicy znaków, możesz rozważyć bardziej ogólną metodę .
o ile rozumiem podstawy struktury danych, jest to najbardziej `` wyrafinowany '' wybór do porównania
LoneXcoder
2
Nie zapomnij wziąć pod uwagę rozmiaru członka długości. int howManyBytes = yourString.Length * sizeof (Char) + sizeof (int);
Zoltan Tirinda
Co zrobić, jeśli długość mojego ciągu jest większa niż Int?
Jurijs Kastanovs
To powinna być poprawna odpowiedź. Ponadto .Długość to liczba bajtów, które serwer otrzyma, jeśli wyślesz ten sam ciąg. To jest to, czego potrzebowałem.
string
zajmuje obiekt lub ile bajtów zajmie reprezentacja ciągu, gdy zostanie zapisana do pliku lub przesłana przez sieć (tj. Zakodowana), ponieważ są to dwa zupełnie różne pytania. majidgeek prawie odpowiedział na pierwsze, a diya na drugie (przynajmniej dla dwóch wspólnych kodowań).Unicode
jest statyczną właściwością programuSystem.Text.Encoding
, która jest klasą bazowąASCIIEncoding
, obie instrukcje są w rzeczywistości takie same. Możesz również uzyskać dostęp do statycznego elementu członkowskiego z podklas (ale nie jest to uważane za idiomatyczne).Odpowiedzi:
Możesz użyć kodowania, takiego jak ASCII, aby uzyskać znak na bajt za pomocą
System.Text.Encoding
klasy.lub spróbuj tego
źródło
Length * sizeof(Char)
, który powinien dać ten sam wynik, ponieważ każdyChar
ma wartość UTF16 / 2-bajtowe), jeśli chcesz mieć taką samą liczbę bajtów, jak wewnętrzna reprezentacja łańcucha. Jeśli faktycznie chcesz mieć dokładną ilość pamięci, jaką zajmuje cały obiekt, a nie tylko liczbę bajtów w jego wewnętrznej tablicy znaków, możesz rozważyć bardziej ogólną metodę .Z MSDN :
Możesz więc użyć tego:
źródło
Lub
źródło