C# - 将数字序列转换为字节

时间:2009-07-08 18:08:05

标签: c# bytearray

我正在尝试按顺序发送与数字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();

谢谢。

5 个答案:

答案 0 :(得分:6)

您需要使用:

BitConverter.GetBytes(INTEGER);

答案 1 :(得分:3)

考虑一下如何区分:

260, 1  -> 0x1, 0x4, 0x1
1, 4, 1 -> 0x1, 0x4, 0x1

如果对最多255个数字使用一个字节而对数字256-1000使用两个字节,则无法在另一端使用哪个数字对应于什么。

如果你只是需要按照描述对它们进行编码而不用担心它们是如何被解码的,那对我来说就是一个人为的作业或测试,我不会为你解决它。

答案 2 :(得分: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]);
        }
    }

这会忽略任何零(从MSB到LSB)的字节。因此对于0-255,它将使用一个字节。 作为其他地方的州,这将不允许您重新解码数据,因为流现在是不明确的。作为旁注,这种方法将其压缩到1743字节(与使用7位编码的1871相反)。

答案 3 :(得分:1)

一个字节只能容纳256个不同的值,因此您不能在一个字节中存储255以上的数字。最简单的方法是使用short,即16位。如果你真的需要节省空间,你可以使用10位数字并将其打包成一个字节数组(10位= 2 ^ 10 = 1024个可能的值)。

答案 4 :(得分: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]。


你可能想做一些工作,以便我&lt; 256取一个字节,i&lt; 65535取两个字节等。但是,如果这样做,则无法读取流中的值。相反,你需要添加长度编码或哨兵位等等。

我会说,不要。只需使用内置类压缩流,或使用同意的一组频率点亮Huffman encoding实现。