如何知道字符串的大小(以字节为单位)?


103

我想知道是否可以string在C#中知道字节的字节数,有人知道吗?



11
您是在问一个string对象占用多少内存,或者当一个字符串表示形式写入文件或通过网络发送(即编码)时,字符串表示将占用多少字节,因为这是两个完全不同的问题。majidgeek几乎回答了前者,而diya回答了后者(至少对于两种常见编码而言)。
2013年

可能需要复制多少字节?
2013年

@AllonGuralnek:好点。您知道为什么下面的diya不建议改用System.Text.Encoding.Unicode.GetByteCount吗?为什么要使用ASCIIEncoding部分?
giorgim

@Giorgi:由于Unicode是的静态属性System.Text.Encoding,它是的基类ASCIIEncoding,所以两个语句实际上是相同的。您也可以从子类访问静态成员(但不认为这是惯用的)。
Allon Guralnek,2015年

Answers:


131

您可以使用ASCII之System.Text.Encoding类的编码来获取每个字节的字符。

或尝试这个

  System.Text.ASCIIEncoding.Unicode.GetByteCount(string);
  System.Text.ASCIIEncoding.ASCII.GetByteCount(string);

13
愚蠢的问题,但是如果字符串中的数据来自第3方文件,我们如何知道要使用Unicode还是ASCII类?
马修·洛克

7
@MatthewLock 如果您希望使用相同数量的字节作为字符串的内部表示形式,则应使用UTF16(或majidgeek的Length * sizeof(Char),由于每个Char字节均为UTF16 / 2字节,因此应产生相同的结果)。如果您实际上想要整个对象占用的确切内存数量,而不仅仅是其内部字符数组中的字节数,那么您可以考虑使用更通用的方法
鲍勃”

91

MSDN

一个String对象的有序集合System.Char,代表了字符串对象。

因此,您可以使用以下代码:

var howManyBytes = yourString.Length * sizeof(Char);

据我了解的数据结构基础,这是最“固定”的选择来比较
LoneXcoder 2015年

2
不要忘记考虑长度成员的大小。int howManyBytes = yourString.Length * sizeof(Char)+ sizeof(int);
Zoltan Tirinda 2015年

如果我的字符串长度大于整数怎么办?
朱里斯·卡斯坦诺夫斯

这应该是正确的答案。另外,.Length是如果发送相同的字符串,服务器将接收的字节数。这就是我所需要的。
DaWiseguy19年

24
System.Text.ASCIIEncoding.Unicode.GetByteCount(yourString);

要么

System.Text.ASCIIEncoding.ASCII.GetByteCount(yourString);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.