0

新しいオブジェクトを割り当てずに long を文字配列に変換する必要がある状況があります。基本的に、実際に文字列オブジェクトを作成せずに long.ToString() で行われることを模倣したい-代わりに、文字は事前定義された配列に挿入されます。これはかなり簡単なはずですが、例が見つかりません。C# ではすべて ToString や String.Format などを使用し、C++ ではすべて stringstream、sprintf、ltoa のいずれかを使用します。何か案は?

編集:少し明確にするために、これはガベージコレクションに耐えられない頻繁に呼び出されるコードのクリティカルセクションの一部であるため、追加の文字列を割り当てたくありません。出力は実際にはバイト配列に配置されますが、このデータの受信者はこの long の文字表現のバイト配列を期待しているため、新しいオブジェクトを割り当てずに文字列形式に変換することでガベージ コレクションを削減しようとしています。

4

1 に答える 1

0

アイデアを提供してくれた@SLaksと、関連する回答を教えてくれた@gypsoCoderに感謝します。これはトリックを行います:

  private static byte[] chars = new byte[] { (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6', (byte)'7', (byte)'8', (byte)'9' };

  /// <summary>
  /// Converts a long to a byte, in string format
  /// 
  /// This method essentially performs the same operation as ToString, with the output being a byte array,
  /// rather than a string
  /// </summary>
  /// <param name="val">long integer input, with as many or fewer digits as the output buffer length</param>
  /// <param name="longBuffer">output buffer</param>
  private void ConvertLong(long val, byte[] longBuffer)
  {
     // The buffer must be large enough to hold the output

     long limit = (long)Math.Pow(10, longBuffer.Length - 1);
     if (val >= limit * 10)
     {
        throw new ArgumentException("Value will not fit in output buffer");
     }

     // Note: Depending on your output expectation, you may do something different to initialize the data here.
     // My expectation was that the string would be at the "front" in string format, e.g. the end of the array, with '0' in any extra space

     int bufferIndex = 1;
     for (long longIndex = limit; longIndex > val; longIndex /= 10)
     {
        longBuffer[longBuffer.Length - bufferIndex] = 0;
        ++bufferIndex;
     }

     // Finally, loop through the digits of the input, converting them from a static buffer of byte values

     while (val > 0)
     {
        longBuffer[longBuffer.Length - bufferIndex] = chars[val % 10];
        val /= 10;
        ++bufferIndex;
     }
  }

これは正の数のみを受け入れ、それ以外の検証は行わないことに注意してください。文字列を割り当てずに long を文字列からバイト配列に変換するという目標を達成するための基本的なアルゴリズムです。

于 2013-10-25T17:34:40.577 に答える