C#3字节Ints

Ash*_*Ash 4 int byte

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

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

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

cta*_*cke 14

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

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

我认为,如果那个1字节确实很重要,那么也许,也许就是说,无论如何,你使用的是错误的语言.你首先保存我没有安装和使用CLR的字节数是很多字节.

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


Ami*_*mir 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 
Run Code Online (Sandbox Code Playgroud)

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

有关更复杂的方法,请查看此页面


Sha*_*mer 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;
 }
Run Code Online (Sandbox Code Playgroud)

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

OddUnion myOddUnion;
myOddUnion.IntegerValue = 4096;
Byte secondByte = myOddUnion.Byte1;
Run Code Online (Sandbox Code Playgroud)

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