C#3字节Ints

时间:2009-01-15 05:20:27

标签: int byte

我正在开发一个项目,我需要在字节级别处理整数。由于节省空间是首要考虑因素,我只需要非常小(和可变长度的int)。

有没有办法可以将int'4096'变成3个字节?或'1053'成2个字节?

显然我cna手动执行=(byte [0] * 256)+(byte [1]),但我想知道是否有更简单的选项将int转换为x字节并再次返回?

5 个答案:

答案 0 :(得分:14)

你能吗?当然。它会节省空间吗?也许,取决于你想做多少工作。你必须明白处理器是32位的,这意味着它有4个字节的寄存器,所以这就是它想要存储和访问的东西。要强制使用3字节“int”,您必须将其保存在字节数组中,并在使用前将其从数组中提取到对齐的地址。这意味着如果你将它存储得很短,那么编译器会将其填平(你会失去你认为已经创建的任何效率),或者读取和写入的速度会慢一些 lot

如果这是一个桌面应用,那么节省空间究竟是一个主要考虑因素,尤其是每个元素说1个字节时?元素访问的性能损失可能会让您改变一个字节的重要性。

我认为,如果那个1字节确实很重要,那么也许,也许,或许,你正在使用错误的语言。你首先保存我没有安装和使用CLR的字节数是这些字节的 lot

旁注:你也做一个转变,而不是乘法(虽然编译器可能会为你做到这一点)。

答案 1 :(得分:5)

您可以进行可变长度整数编码。多年前的旧方法是使用每个字节的高位来表示整数继续到另一个字节。所以每个字节丢失一位,但获得小整数。这在持久存储中非常有用,其中每个最后一个字节都很重要。

示例:假设我们正在处理无符号整数,我们将

int  binary
0                       00000000
1                       00000001
...  
127                     01111111
128            00000001 10000000
129            00000001 10000001
...
255            00000001 11111111
256            00000010 10000000
...
16383          01111111 11111111
16384 00000001 10000000 10000000 

所以0-127需要1个字节,128-16383需要2个字节,等等......

有关更复杂的方法,请查看this page

答案 2 :(得分:5)

只是为了增加精神错乱,让我们使用旧的C风格联合技巧在C#中实现:

[StructLayout(LayoutKind.Explicit)]
struct OddUnion
{
    /* The 32-bit integer value */
    [FieldOffset(0)]
    public int IntegerValue;

    /* The bytes that overlap with it */
    [FieldOffset(0)]
    public byte Byte1;
    [FieldOffset(1)]
    public byte Byte2;
    [FieldOffset(2)]
    public byte Byte3;
    [FieldOffset(3)]
    public byte Byte4;
 }

然后,当你想“转换”时,请执行以下操作:

OddUnion myOddUnion;
myOddUnion.IntegerValue = 4096;
Byte secondByte = myOddUnion.Byte1;

但是,如果您希望“节省”从单词中移出单个字节的成本,那么这只会有所帮助。我没有看过生成的SMIL,所以我不知道这是否比任何其他解决方案更便宜。

答案 3 :(得分:3)

BitConverter.GetBytes会得到你的字节。

BitConverter.ToInt32将从字节中获取32位int。

答案 4 :(得分:1)

你必须做一些转移。如果使用HEX会更容易,因为每个数字(我的意思是每个数字,但数字是基数10,十六进制git)代表四位。