c#:将int转换为适合的最小字节数组

时间:2011-11-07 14:19:33

标签: c# bytearray

我想要一种优雅,高效的方法来获取任何无符号整数并将其转换为适合的最小字节数组。例如:

250 = byte[1]
2000 = byte[2]
80000 = byte[3]

所以我可以写:

var foo = getBytes(bar);

foo的长度不同,具体取决于bar的值。我该怎么做?

7 个答案:

答案 0 :(得分:3)

你可以这样做,作为一种扩展方法:

public static byte[] ToByteArray(this int value) {
     var bytes = Enumerable
                     .Range(0, sizeof(int))
                     .Select(index => index * 8)
                     .Select(shift => (byte)((value >> shift) & 0x000000ff))
                     .Reverse()
                     .SkipWhile(b => b == 0x00)
                     .ToArray();
     return bytes;
}

然后:

int j = 2000;
var bytes = j.ToByteArray();
Console.WriteLine(bytes.Length);
for(int index = 0; index < bytes.Length; index++) {
    Console.WriteLine("{0:x}", bytes[index]);
}

给出:

2
0x07
0xd0

在上面的j = 2000中替换j = 80000给出了

3
0x01
0x38
0x80

在上面的j = 2000中替换j = 250给出了

1
0xfa

答案 1 :(得分:2)

没有一种方法可以使用,但你可以很容易地做到(警告 - 未经测试)

byte[] bytes;

if ((i & 0xffffff00)==0) {
    bytes = new byte[] { (byte)i };
}
else if ((i & 0xffff0000)==0) {
    bytes = new byte[] { (byte)(i & 0xff), (byte)((i & 0xff00) >> 8) };
}
else if ((i & 0xff000000)==0) {
    bytes = new byte[] { (byte)(i & 0xff), (byte)((i & 0xff00) >> 8), (byte)((i & 0xff0000) >> 16) };
}
else {
    bytes = BitConverter.GetBytes(i);
}

答案 2 :(得分:2)

这将为您提供所有字节:

static byte[] GetBytes(uint bar)
    {
        return BitConverter.GetBytes(bar).Reverse().SkipWhile(c => c == 0).Reverse().ToArray();
    }

答案 3 :(得分:1)

你可能只是硬编码边界点,但如果你想要一个更动态的方法,你可以使用这样的东西:

byte[] getBytes(uint bar) {
    if (bar == 0) return new byte[0];

    return getBytes(bar / 256)
            .Concat(Enumerable.Repeat((byte)(bar % 256), 1))
            .ToArray();
}

答案 4 :(得分:1)

它也适用于长类型(唯一的变化是&#34;字节?[4]&#34;到&#34;字节?[8]&#34;和当然的声明)。

static byte[] ToArray(int num) 
{
    byte?[] b = new byte?[4];
    int i = 0;

    do b[i++] = (byte)num;
    while ((num = num >> 8) > 0);

    byte[] result = new byte[i];
    for (int j = 0; j < i; j++)
        result[j] = b[j].Value;

    return result;
}

答案 5 :(得分:0)

private byte[] GetBytes(int number)
{            
    if (number < 0) 
    {
        throw new ArgumentException("Can not be less than zero", "number");
    }

    int numberOfBits = 0;
    while (number > 0)
    {
        numberOfBits++;
        number = number >> 1;
    }

    int reminder = 0;
    int numberofBytes = Math.DivRem(numberOfBits, 8, out reminder);
    numberofBytes = reminder > 0 ? numberofBytes + 1 : numberofBytes;
    return new byte[numberofBytes];
}

答案 6 :(得分:0)

这应该相当快,并且它只分配尽可能多的空间。

static byte[] getBytes(long a)
{
    int k=0;
    for (long b=a; b!=0; b>>=8) k++;
    byte[] res = new byte[k];
    for (k=0; a!=0; a>>=8)
        res[res.Length-(++k)] = (byte)(a&0xFF);
    return res;
}