【问题标题】:Using an int as the numerical representation of a string in C#在 C# 中使用 int 作为字符串的数字表示
【发布时间】:2010-05-13 08:56:07
【问题描述】:

我正在尝试使用整数作为字符串的数字表示,例如,将“ABCD”存储为 0x41424344。但是,在输出方面,我必须将整数转换回 4 个 ASCII 字符。现在,我正在使用位移和掩码,如下所示:

int value = 0x41424344;
string s = new string (
              new char [] { 
                 (char)(value >> 24), 
                 (char)(value >> 16 & 0xFF),
                 (char)(value >> 8 & 0xFF),
                 (char)(value & 0xFF) });

有没有更清洁的方法来做到这一点?我尝试了各种强制转换,但编译器正如预期的那样抱怨它。

【问题讨论】:

  • 如果您解释为什么您会这样做,我们可能会有更好的解决方案。
  • 只需要支持ASCII还是需要考虑不同的编码?
  • 是的,我的第一个想法就是:“亲爱的上帝,为什么???”
  • 也许要编码一个 FourCC 标签?
  • 这是在汇编程序中使用的,因此字符串的整数值被相当频繁地使用,但需要将其转换为字符串一次以创建可读的输出。这只会使用 ASCII。

标签: c# string int


【解决方案1】:

字符是 16 位的,因此您必须将它们编码为 8 位值才能将它们打包成一个整数。您可以使用Encoding 类在字符和字节之间进行转换,并使用BitConverter 类在字节和整数之间进行转换

这是双向转换:

string original = "ABCD";

int number = BitConverter.ToInt32(Encoding.ASCII.GetBytes(original), 0);

string decoded = Encoding.ASCII.GetString(BitConverter.GetBytes(number));

请注意,整数中字节的顺序取决于计算机的字节序。在小端系统上,“ABCD”的数值将为 0x44434241。要获得相反的顺序,您可以反转字节数组:

byte[] data = Encoding.ASCII.GetBytes(original);
Array.Reverse(data);
int number = BitConverter.ToInt32(data, 0);

byte[] data2 = BitConverter.GetBytes(number);
Array.Reverse(data2);
string decoded = Encoding.ASCII.GetString(data2);

或者,如果您使用的是框架 3.5:

int number =
  BitConverter.ToInt32(Encoding.ASCII.GetBytes(original).Reverse().ToArray() , 0);

string decoded =
  Encoding.ASCII.GetString(BitConverter.GetBytes(number).Reverse().ToArray());

【讨论】:

    【解决方案2】:
    int value = 0x41424344;
    string s = Encoding.ASCII.GetString(
                   BitConverter.GetBytes(value).Reverse().ToArray());
    

    (以上假设您在小端系统上运行。对于大端系统,您可以删除 .Reverse().ToArray() 部分,但如果您在小端系统上,那么它可能更有意义如果可能的话,您首先将“ABCD”存储为 0x44434241。)

    【讨论】:

      【解决方案3】:
      public string ConvertToHex(string asciiString)
      {
          string hex = "";
          foreach (char c in asciiString)
          {
              int tmp = c;
              hex += String.Format("{0:x2}", (uint)System.Convert.ToUInt32(tmp.ToString()));
          }
          return hex;
      } 
      

      它将根据您的需要将字符串转换为十六进制。

      【讨论】:

      • 我认为 OP 正在寻找相反的东西。给定一个数字,它应该被转换回字符串。
      【解决方案4】:
      public static string ToHexString(string value)
      {
          return value.Aggregate(new StringBuilder("0x"),
              (sb, c) => sb.AppendFormat("{0:x2}", (int)c)).ToString();
      }
      

      【讨论】:

        【解决方案5】:

        如果字符串不超过 8 个字符和一种 Hexstring,你可以使用 基变量 16 看看 Convert 类中的 Conversion 函数。

        string s = "ABCD";
        uint i = Convert.ToUInt32( s, 16 );
        MessageBox.Show( Convert.ToString( i, 16 ) );
        

        问候 哎呀

        【讨论】:

        • 这不是关于十六进制而是关于ASCII,字符串很可能是"Aa4@?"
        • 好的抱歉我完全误解了这个问题
        猜你喜欢
        • 1970-01-01
        • 2011-11-26
        • 1970-01-01
        • 1970-01-01
        • 2015-02-23
        • 2012-12-25
        • 1970-01-01
        • 2021-09-22
        • 2017-07-19
        相关资源
        最近更新 更多