0

たとえば、バイト[]ユーザー=新しいバイト[] {112、114、97、116、121、117、115、104、0、0、0、 0, 49, 50, 51, 0} ここで、最初の 12 バイトはサーバー名で、最後の 4 バイトは ID です。

以前のstackoverflowの投稿を調べて、このコードを思いつきました

[StructLayout(LayoutKind.Explicit)]
struct packetrf
{
  public ulong servername
    {
        get
        {
            return (ulong)servername1 | ((ulong)servername2 << 8) | ((ulong)servername3 << 16) | ((ulong)servername4 << 24) | ((ulong)servername5 << 32) | ((ulong)servername6 << 40) | ((ulong)servername7 << 48) | ((ulong)servername8 << 56) | ((ulong)servername9 << 64) | ((ulong)servername10 << 72) | ((ulong)servername11 << 80) | ((ulong)servername12 << 88);
        }
    }

    [FieldOffset(0)]
    public byte servername1;

    [FieldOffset(1)]
    public byte servername2;

    [FieldOffset(2)]
    public byte servername3;

    [FieldOffset(3)]
    public byte servername4;

    [FieldOffset(4)]
    public byte servername5;

    [FieldOffset(5)]
    public byte servername6;

    [FieldOffset(6)]
    public byte servername7;

    [FieldOffset(7)]
    public byte servername8;

    [FieldOffset(8)]
    public byte servername9;

    [FieldOffset(9)]
    public byte servername10;

    [FieldOffset(10)]
    public byte servername11;

    [FieldOffset(11)]
    public byte servername12;

   [FieldOffset(12)]
    public Int32 imei_msn;
};

static private pack fromByte(byte[] arr)
{
    pack str = new pack();
    GCHandle handle = GCHandle.Alloc(arr, GCHandleType.Pinned);
    str = (pack)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(pack));
    handle.Free();
    return str;
}

static private void data_parser(byte[] pkt, int size, int indexno)
{
       packetrf data = fromByte(pkt);
        Console.WriteLine();
        Console.WriteLine(data.servername);
        Console.WriteLine(data.imei_msn);
        Console.ReadKey();
    }


public static void Main()
{
    byte[] user = new byte[] {112, 114, 97, 116, 121, 117, 115, 104, 0, 0, 0, 0, 49, 50, 51, 0}
    data_parser(user, 1, 2);
}

このコードを実行すると、出力は servername の場合は 7526488566770266736、imei_msn の場合は 13106 で、おそらく ascii->hex->decimal 形式です。今私が直面している問題は、これらの数字を意味のある完全な情報に変換するにはどうすればよいですか?

4

4 に答える 4

2

固定サイズの配列を使用してみてください (こちらをお読みくださいhttps://stackoverflow.com/a/14629106/613130 )

[StructLayout(LayoutKind.Explicit)]
struct packetrf
{
    [FieldOffset(0), MarshalAs(UnmanagedType.ByValArray, SizeConst=12)]
    public byte[] servername;

    [FieldOffset(12)]
    public Int32 imei_msn;
};

そこから:

string serv = Encoding.ASCII.GetString(yourObject.servername).TrimEnd('\0');

またはプロパティとして直接

public string serverName2
{
    get
    {
        return Encoding.ASCII.GetString(servername).TrimEnd('\0');
    }
}

そして、そこにいるTrimEndすべての人に覚えておいてください。'\0'byte[]

エンコーディングは確かASCIIですか? àèéìòù名前にアクセント付きの文字をいくつか入れてみてくださいUTF8。または、Defaultエンコーディングを使用している可能性があります。

于 2013-08-14T08:21:48.110 に答える
0

プロジェクトで /unsafe を使用しても問題ない場合は、次のように固定バッファーを使用できます。

[StructLayout(LayoutKind.Explicit)]
unsafe struct packetrf
{
    [FieldOffset(0)]
    public fixed byte[12] servername;

    [FieldOffset(12)]
    public Int32 imei_msn;
}
于 2013-08-14T08:38:01.477 に答える
0

これはうまくいくはずです:

string serverName = Encoding.ASCII.GetString(user.Take(12).ToArray());
string imeiMsn = Encoding.ASCII.GetString(user.Skip(12).ToArray());
Console.WriteLine(serverName);
Console.WriteLine(imeiMsn);
于 2013-08-14T09:26:00.877 に答える
0

servername1あなたの—servername12バイトをbyte[12]配列に追加してみてください。

byte[] array = GetBytesOfServerName();
string serverName = Encoding.ASCII.GetString(array);
于 2013-08-14T08:21:24.353 に答える