【问题标题】:C# String compiled in ASCII [duplicate]以 ASCII 编译的 C# 字符串 [重复]
【发布时间】:2017-01-18 13:36:31
【问题描述】:

据我所知,C# 中的每一个字符串都被编译成 unicode。

aUnableToParseL:                        // DATA XREF: test.main__Main+38o
unicode <Unable to parse local IPv4s.>,0

我想知道,有什么方法可以告诉编译器,将所有字符串编译成 ASCII 格式? (每个字符 1 个字节)

【问题讨论】:

  • 要回答您的主要问题,答案似乎是否定的。您无法更改编译器存储字符串的方式。这是另一个类似问题的链接:stackoverflow.com/questions/6550254/…
  • 你不能那样做。如果您一心想减少几千字节您的可执行文件,那么不要存储开头的字符串,只需使用格式为 ASCII 的文件,您可以根据需要在其中读取字符串。我真的不确定为什么有必要这样做,但您别无选择;它不是您可以修改的编译器选项。
  • 好吧,@mexikanoZ,就内存野蛮和性能而言,托管语言并不是最佳选择,这是众所周知的。对于这种场景,C/C++ 是更合理的选择。
  • 这听起来像XY problem;你想要“最终保护几千个字节”并决定“将所有字符串编译成 ASCII”来做到这一点。停止;这极不可能有帮助。告诉我们这个“安全的几千字节”要求来自哪里,我们也许可以提供帮助。根据您的数据,压缩 Unicode 比使用 ASCII 更有可能节省字节,但我们不知道您的数据是什么。
  • 在 .NET 和 C# 中,所有字符串都使用 UTF-16 编码,但有一个例外:codeblog.jonskeet.uk/2014/11/07/when-is-a-string-not-a-string

标签: c#


【解决方案1】:

正如其他人所提到的,您可以将 ASCII 保存在文本文件中,甚至可以将其作为资源添加到项目中,以便将其包含在可执行文件中。您甚至可以更疯狂地压缩 ASCII 并将其添加为资源。

这可以减少内存消耗,但也会增加 CPU 使用率并使执行速度变慢。可能您程序中的几乎所有方法都接受 .NET UTF-16 System.String,因此必须将 ASCII 编码为使用 CPU 的 System.String

这是优化中常见的(但并非总是)权衡取舍 - 更快更大或更小更慢。

有一些方法可以避免编码。例如使用接受 ANSI 字符串的 winapi What is the difference between the `A` and `W` functions in the Win32 API?

如果你改Console.OutputEncodingPrint ASCII line art characters in C# console application,我不确定是否有任何编码

【讨论】:

    【解决方案2】:

    您可以将字符串存储为字节数组,然后根据需要将它们转换为char 数组或strings。

    只需在System.Text 命名空间中使用ASCIIEnconding 类。相关的方法是:

     char[] GetChars(byte[] bytes);
     string GetString(byte[] bytes);
    

    当然,charstring 是 UTF-16,所以你并没有真正获得太多,因为你最终会付出你试图避免的内存“价格”;无论是可执行文件大小还是运行时内存。

    归根结底,我不确定您为什么要这样做,特别是在托管环境中似乎毫无意义;如果您处于这种资源优化级别,那么在完全不同的环境中可能会更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 2016-09-18
      • 2013-08-15
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      相关资源
      最近更新 更多