문제

TCP 소켓을 통해 구조물에서 바이트 어레이를 얻는 가장 좋은 방법은 무엇입니까? .NET (vb 또는 c#)를 사용하고 있습니다.

도움이 되었습니까?

해결책

C#을 사용하는 경우 직렬화를 더 잘 제어하기 위해 기본 버퍼 직접 마샬링 할 수도 있습니다.

구조물에 적절한 속성을 추가해야합니다.

  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack=1)]

그런 다음 다음을 사용하여 직렬화 할 수 있습니다.

    /// <summary>
    /// Serializes the specified object into a byte array.
    /// </summary>
    /// <param name="nativeObject">The object to serialize.</param>
    /// <returns></returns>
    public static byte[] Serialize(object obj)
    {
        Type objectType = obj.GetType();
        int objectSize = Marshal.SizeOf(obj);
        IntPtr buffer = Marshal.AllocHGlobal(objectSize);
        Marshal.StructureToPtr(obj, buffer, false);
        byte[] array = new byte[objectSize];
        Marshal.Copy(buffer, array , 0, objectSize);
        Marshal.FreeHGlobal(buffer);
        return array;
    }

다른 팁

당신은 조사해야합니다 직렬화. 당신이 사용할 수있는 옵션이 여러 가지가 있습니다. 규약 버퍼 (1st 및 2nd에 의한 구현은 사용자가 XML ~로 Binaryformatter.

이기종 네트워크에서 의사 소통하기 위해 엔디언을 기꺼이 돌보려면이 작업을 수행하는 유일한 방법은 필드별로입니다.

바이너리 리더를 사용하여 구조물의 필드를 채우고 다시 읽으십시오. 당신이 알아야 할 것은 구조물의 필드 크기와 스트림의 위치이며, 관리되지 않는 솔루션이 필요하지 않습니다. 여기에 내가 쓴 웨이브 플레이어의 예는 다음과 같습니다.

    /// <summary>Copies header to a stream</summary>
    /// <param name="waveData">Wav data stream</param>
    /// <param name="format">WAVEFORMATEX wav format</param>
    /// <returns>Stream</returns>
    public Stream CreateStream(Stream waveData, WAVEFORMATEX format)
    {
        MemoryStream stream = new MemoryStream();
        BinaryWriter writer = new BinaryWriter(stream);

        writer.Write(System.Text.Encoding.ASCII.GetBytes("RIFF".ToCharArray()));
        writer.Write((Int32)(waveData.Length + 36)); //File length minus first 8 bytes of RIFF description
        writer.Write(System.Text.Encoding.ASCII.GetBytes("WAVEfmt ".ToCharArray()));
        writer.Write((Int32)16); //length of following chunk: 16
        writer.Write((Int16)format.wFormatTag);
        writer.Write((Int16)format.nChannels);
        writer.Write((Int32)format.nSamplesPerSec);
        writer.Write((Int32)format.nAvgBytesPerSec);
        writer.Write((Int16)format.nBlockAlign);
        writer.Write((Int16)format.wBitsPerSample);
        writer.Write(System.Text.Encoding.ASCII.GetBytes("data".ToCharArray()));
        writer.Write((Int32)waveData.Length);

        waveData.Seek(0, SeekOrigin.Begin);
        byte[] b = new byte[waveData.Length];
        waveData.Read(b, 0, (int)waveData.Length);
        writer.Write(b);
        writer.Seek(0, SeekOrigin.Begin);
        return stream;
    }

당신은 더 구체적이고 당신의 언어를 알려야합니다.

많은 언어의 경우, 이러한 종류의 일을하기위한 기성품 프레임 워크 또는 언어 표준 환경의 일부가 있습니다.

"struct"라고 말하면 C 언어를 가정합니다.

호출 된 함수를 사용할 수 있습니다

ssize_t write (int fd, const void *buf, size_t count);

여기서 FD는 소켓의 제출자 인 버퍼는 구조의 주소이며 카운트는 바이트의 크기입니다.

당신은 그것을 다음과 같이 사용합니다.

쓰기 (소켓, & struct_var, sizeof (struct_var));

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top