题
我工作的一个项目,我需要处理在与整数字节级。由于节省空间是一个主要考虑因素,我只需要非常小的(和可变长度整数)。
时有可以转动INT“4096”到3个字节的方法吗?或 '1053' 转换为2个字节?
显然我中央社做手工=(字节[0] * 256)+(字节[1]),但我想知道是否有到整型转换成x字节,然后再返回一个更容易的选择?
解决方案
你能吗?当然。将它保存任何空间?也许,这取决于有多少工作,你想做的事情。你必须明白的是,处理器是32位的,这意味着它有4级字节的寄存器,所以这是怎么回事想存储和访问的东西。要强制一个3字节“INT”你必须保持在一个字节数组,并在使用前从阵列中提取它的对齐的地址。这意味着,如果你保存它的短,编译器将要么垫出来(你会失去你认为你已经创建的效率),或者这将是一个的很多的慢读取和写入。
如果这是一个桌面应用程序,究竟是节省空间的主要考虑因素,每个元素聊天1个字节尤其是当?该PERF处罚元素访问可能会改变主意有关如何至关重要的一个字节。
我认为,如果1个字节确实是重要的,也许,只是也许,你使用了错误的语言呢。你会来救我的不是安装和首先使用CLR的字节数是的很多这些字节的。
边注:您也愿意做一个转变,不是乘法(虽然编译器可能会得到有你)
其他提示
只是为了增加疯狂,让我们使用旧的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,所以不知道这是否是相比于任何其它溶液中的任何便宜。
您可以做可变长度整数编码。从几年前的老方法是使用每个字节的高比特来表示整数继续进行到另一个字节。所以你失去每字节一位,但得到小整数。这主要是有用的持久化存储,每一个最后的字节数。
示例:假设我们正在处理的无符号整数,我们将有
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个字节,等等...
有关做这个检查此页面的更复杂的方式。
BitConverter.GetBytes
将让你的字节数。
和
BitConverter.ToInt32
将让你从字节32位的int。
您必须做一些比特移位。如果你用HEX工作,因为每一个数字(我的意思是每一个数字,但数字是基地10进制GIT)表示四个位要容易得多。