0

こんにちは、C# でクライアント アプリケーションを開発しており、サーバーは C++ で記述されています。

サーバーは以下を使用します。

inline void StrToInts(int *pInts, int Num, const char *pStr)
{
  int Index = 0;
  while(Num)
  {
    char aBuf[4] = {0,0,0,0};
    for(int c = 0; c < 4 && pStr[Index]; c++, Index++)
      aBuf[c] = pStr[Index];
    *pInts = ((aBuf[0]+128)<<24)|((aBuf[1]+128)<<16)|((aBuf[2]+128)<<8)|(aBuf[3]+128);
    pInts++;
    Num--;
  }

  // null terminate
  pInts[-1] &= 0xffffff00;
}

文字列を int[] に変換する

私のC#クライアントで私は受け取ります:

int[4] { -14240, -12938, -16988, -8832 }

配列を文字列に変換するにはどうすればよいですか? 安全でないコード (ポインターなど) を使用したくない 私の試行のいずれかで文字列が読み取れなくなりました。

編集:これが私のアプローチの1つです:

private string IntsToString(int[] ints)
{
  StringBuilder s = new StringBuilder();
  for (int i = 0; i < ints.Length; i++)
  {
    byte[] bytes = BitConverter.GetBytes(ints[i]);
    for (int j = 0; j < bytes.Length; j++)
      s.Append((char)(bytes[j] & 0x7F));
  }
  return s.ToString();
}

エンディアンに注意する必要があることはわかっていますが、サーバーはローカル マシンとサーバーでも実行されているため、これは問題ではないと思います。
私の他の試みは、明示的なレイアウトと整数と文字に同じ FieldOffset を持つ構造体を使用することでしたが、どちらも機能しません。

4

3 に答える 3

1

たぶん(LINQを使用して)次のようなことを試してください:

int[] fromServer = { -14240, -12938, -16988, -8832, };

string reconstructedStr = new string(fromServer.SelectMany(BitConverter.GetBytes).Select(b => (char)(b - 128)).ToArray());

テストされていませんが、開始するものがあります。128の減算が正しいかどうかわからない。

于 2012-12-01T23:12:04.027 に答える
1

この方法でカンマ区切りの文字列を作成できます。

string str = String.Join(", ", intArray.Select(x => x.ToString()).ToArray());
于 2012-12-01T22:44:43.690 に答える
0
    var ints = new[] {-14240, -12938, -16988, -8832};
    var result = string.Join("-", ints.Select(i => BitConverter.ToString(BitConverter.GetBytes(i))));
    Console.WriteLine(result); //60-C8-FF-FF-76-CD-FF-FF-A4-BD-FF-FF-80-DD-FF-FF

BitConverter.ToString後で文字列を解析する方法に応じて、ここで別のものに置き換えることができます。

于 2012-12-01T23:01:15.853 に答える