【问题标题】:Converting non digit text to double and then back to string将非数字文本转换为双精度然后返回字符串
【发布时间】:2015-03-11 20:55:31
【问题描述】:

我有一个独特的情况,我必须在已经建立的平台上编写代码,所以我试图找出一个技巧来使某些东西工作。

我的问题是我有一个用户定义的字符串。基本上命名一个信号。我需要把它放到另一个程序中,但唯一可用的方法是在一个 double 值内。以下是我尝试过但无法使其正常工作的方法。我尝试将字符串转换为字节数组,然后通过循环字节创建一个新字符串。然后我将此字符串转换为 Double。然后使用BitCoverter将其取回字节数组,然后尝试获取字符串。

不确定这是否可以实现。有什么想法吗?

string signal = "R3MEXA";
string newId = "1";

byte[] asciiBytes = System.Text.Encoding.ASCII.GetBytes(signal);

foreach (byte b in asciiBytes)
    newId += b.ToString();

double signalInt = Double.Parse(newId);

byte[] bytes = BitConverter.GetBytes(signalInt);

string result = System.Text.Encoding.ASCII.GetString(bytes);

【问题讨论】:

  • 为什么不使用字符串转字节数组,然后在Byte[] Convert.ToDouble(byte)中foreach字节
  • 信号字符串的“范围”是多少,例如最长字符串,最短字符串,什么字符等?
  • 你试过在你的 asciiBytes 数组上使用BitConverter.ToDouble 方法吗?如果将数组填充为 8 字节长度,则不需要 newIdforeach 循环和 Double.Parse(newId)

标签: c# bytearray converter


【解决方案1】:

假设您的字符串由 ASCII 字符(7 位)组成:

将您的字符串转换为位数组,每个字符七位。

将此位数组转换为一串数字,每个数字使用 3 位。 (有数字0..7)

将此数字字符串转换为双精度数。

【讨论】:

    【解决方案2】:

    您最初将newId 设置为"1",这意味着当您稍后进行转换时,除非再次考虑"1",否则您将无法获得正确的输出。

    【讨论】:

      【解决方案3】:

      它不起作用,因为如果你将它转换回来,你不知道一个字节的长度。 所以我将每个字节的长度设为 3。

              string signal = "R3MEXA";
              string newId = "1";
      
              byte[] asciiBytes = System.Text.Encoding.ASCII.GetBytes(signal);
      
              foreach (byte b in asciiBytes)
                  newId += b.ToString().PadLeft(3,'0'); //Add Zero, if the byte has less than 3 digits
      
              double signalInt = Double.Parse(newId);
      
              //Convert it back
              List<byte> bytes = new List<byte>(); //Create a list, we don't know how many bytes will come (Or you calc it: maximum is _signal / 3)
              //string _signal = signalInt.ToString("F0"); //Maybe you know a better way to get the double to string without scientific
              //This is my workaround to get the integer part from the double:
              //It's not perfect, but  I don't know another way at the moment without losing information
              string _signal = "";
              while (signalInt > 1)
              {
                  int _int = (int)(signalInt % 10);
                  _signal += (_int).ToString();
                  signalInt /= 10;
              }
              _signal = String.Join("",_signal.Reverse());
              for (int i = 1; i < _signal.Length; i+=3)
              {
                  byte b = Convert.ToByte(_signal.Substring(i, 3)); //Make 3 digits to one byte
                  if(b!=0) //With the ToString("F0") it is possible that empty bytes are at the end
                  bytes.Add(b);
              }
              string result = System.Text.Encoding.ASCII.GetString(bytes.ToArray()); //Yeah "R3MEX" The "A" is lost, because double can't hold that much.
      

      有什么可以改进的?

      • 并非每个 PadLeft 都是必需的。从后向前工作,如果一个字节的第三位大于 2,你知道,这个字节只有两位。 (对不起我的英语,我写了一个例子)。

      示例

      194 | 68 | 75 | 13
      194687513
      Reverse:
      315786491
      31  //5 is too big    13
      57  //8 is too big    75
      86  //4 is too big    68
      491 //1 is ok        194
      

      【讨论】:

      • 我试过了,但我从结果中得到了 R3MEZ 的回报
      • 我添加了一个解决方法,这样您就不会丢失信息。
      猜你喜欢
      • 1970-01-01
      • 2014-06-11
      • 2023-04-01
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      相关资源
      最近更新 更多