0

1 ~ 1000 の数字に対応するバイトの UDP パケットを順番に送信しようとしています。各数値 (1、2、3、4、...、998、999、1000) を必要な最小バイト数に変換し、それらを UDP パケットとして送信できる順序にするにはどうすればよいですか?

次のことを試しましたが、成功しませんでした。どんな助けでも大歓迎です!

 List<byte> byteList = new List<byte>();

        for (int i = 1; i <= 255; i++)
        {
            byte[] nByte = BitConverter.GetBytes((byte)i);
            foreach (byte b in nByte)
            {
                byteList.Add(b);
            }
        }

        for (int g = 256; g <= 1000; g++)
        {
            UInt16 st = Convert.ToUInt16(g);
            byte[] xByte = BitConverter.GetBytes(st);
            foreach (byte c in xByte)
            {
                byteList.Add(c);
            }
        }


        byte[] sendMsg = byteList.ToArray();

ありがとうございました。

4

5 に答える 5

6

使用する必要があります:

BitConverter.GetBytes(INTEGER);
于 2009-07-08T18:12:44.917 に答える
2

7 ビットでエンコードされた整数に沿って何かを探していると思います。

protected void Write7BitEncodedInt(int value)
{
    uint num = (uint) value;
    while (num >= 0x80)
    {
        this.Write((byte) (num | 0x80));
        num = num >> 7;
    }
    this.Write((byte) num);
}

(から取得System.IO.BinaryWriter.Write(String))。

逆はSystem.IO.BinaryReaderクラスにあり、次のようになります。

protected internal int Read7BitEncodedInt()
{
    byte num3;
    int num = 0;
    int num2 = 0;
    do
    {
        if (num2 == 0x23)
        {
            throw new FormatException(Environment.GetResourceString("Format_Bad7BitInt32"));
        }
        num3 = this.ReadByte();
        num |= (num3 & 0x7f) << num2;
        num2 += 7;
    }
    while ((num3 & 0x80) != 0);
    return num;
}

本当に匂いがしますが、これが宿題ではないことを願っています.

編集:

それでは、すべてをまとめてみましょう。

using System;
using System.IO;

namespace EncodedNumbers
{
    class Program
    {
        protected static void Write7BitEncodedInt(BinaryWriter bin, int value)
        {
            uint num = (uint)value;
            while (num >= 0x80)
            {
                bin.Write((byte)(num | 0x80));
                num = num >> 7;
            }
            bin.Write((byte)num);
        }


        static void Main(string[] args)
        {
            MemoryStream ms = new MemoryStream();
            BinaryWriter bin = new BinaryWriter(ms);

            for(int i = 1; i < 1000; i++)
            {
                Write7BitEncodedInt(bin, i);
            }

            byte[] data = ms.ToArray();
            int size = data.Length;
            Console.WriteLine("Total # of Bytes = " + size);

            Console.ReadLine();
        }
    }
}

私が取得した合計サイズは、1 ~ 1000 の数字で 1871 バイトです。ところで、これが宿題かどうか簡単に教えていただけますか?明らかに、私たちはどちらの方法でも支援します。しかし、実際に自分で学ぶことができるように、もう少し頑張ってください。

編集#2:

それらをデコードして戻す機能を無視してそれらをパックしたい場合は、次のようにすることができます。

    protected static void WriteMinimumInt(BinaryWriter bin, int value)
    {
        byte[] bytes = BitConverter.GetBytes(value);
        int skip = bytes.Length-1;
        while (bytes[skip] == 0)
        {
            skip--;
        }
        for (int i = 0; i <= skip; i++)
        {
            bin.Write(bytes[i]);
        }
    }

これは、0 のバイト (MSB から LSB まで) を無視します。したがって、0 ~ 255 の場合は 1 バイトを使用します。他の場所で述べているように、ストリームがあいまいであるため、データをデコードすることはできません。補足として、このアプローチでは 1743 バイトに圧縮されます (7 ビット エンコーディングを使用する 1871 とは対照的です)。

于 2009-07-08T18:56:39.243 に答える
1

1 バイトには 256 個の個別の値しか保持できないため、255 を超える数値を 1 バイトに格納することはできません。最も簡単な方法は、16 ビットの short を使用することです。本当にスペースを節約する必要がある場合は、10 ビットの数値を使用してバイト配列にパックできます (10 ビット = 2^10 = 1024 の可能な値)。

于 2009-07-08T18:12:17.820 に答える
0

素朴に(また、テストされていない):

List<byte> bytes = new List<byte>();

for (int i = 1; i <= 1000; i++)
{
    byte[] nByte = BitConverter.GetBytes(i);
    foreach(byte b in nByte) bytes.Add(b);
}

byte[] byteStream = bytes.ToArray();

4バイトの各グループが数値[1、1000]であるバイトストリームを提供します。


i < 256 の場合は 1 バイト、i < 65535 の場合は 2 バイトなど、いくつかの作業を実行したくなるかもしれません。ただし、これを行うと、ストリームから値を読み取ることができません。代わりに、長さのエンコードやセンチネル ビットなどを追加します。

私は言うだろう、しないでください。組み込みクラスを使用してストリームを圧縮するか、合意された一連の周波数を使用してハフマンエンコーディングの実装を開始します。

于 2009-07-08T18:25:21.303 に答える