好的,我想解释位移如何工作以及如何从字节数组构建数据。语言并不重要(如果需要一个例子,我知道C,C ++,Java和C# ,它们都遵循相同的转换语法,不是吗?)
问题是,如何从byte []到一堆字节一起? (16位整数,32位整数,64位整数,n位整数)更重要的是,为什么?我想了解并学习如何自己制作,而不是从互联网上复制。 我知道endianess,我主要讨论小端的东西,但解释两个系统的一般规则会很好。 非常非常感谢你!! 费德里科
答案 0 :(得分:3)
我想说的是换位。 byte1<< n将字节1的位移位到左边n次,并且可以通过将byte1乘以2 ^ n得到结果...并且对于>> n,我们必须将byte1除以2 ^ n。
答案 1 :(得分:2)
my32BitInt = byte1 << 24 | byte2 << 16 | byte3 << 8 | byte4
答案 2 :(得分:0)
通常,编译器会为您处理endianess。因此,您可以将OR字节与移位一起使用,而不必过于担心。
我过去曾经使用过一些作弊来节省周期。当我知道数据在数组中最少到最重要的顺序时,那么你可以将字节转换为更大的类型,并按照walker的大小遍历数组。例如,此示例一次遍历4个字节,并在C中写入4个字节的整数。
char bytes[] = {1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1};
int *temp;
temp = (int *)&bytes[0];
printf("%d\n", *temp);
temp = (int *)&bytes[4];
printf("%d\n", *temp);
temp = (int *)&bytes[8];
printf("%d\n", *temp);
temp = (int *)&bytes[12];
printf("%d\n", *temp);
return 0;
输出: 1 256 65536 16777216
这可能对C#和Java
没有好处答案 3 :(得分:0)
您需要考虑数据的字节顺序。从那里,它取决于数据类型 - 但这是一个例子。假设您想从4个字节的数组转换为无符号的32位整数。我们还假设字节的顺序与它们的开始顺序相同(因此我们不需要担心字节顺序)。
//In C
#include <stdint.h>
uint32_t offset; //the offset in the array, should be set to something
uint32_t unpacked_int; //target
uint8_t* packed_array; //source
for ( uint32_t i = 0; i < 4; --i ) {
unpacked_int += packed_array[ offset + i ] << 8*i;
您也可以等效地使用| =和OR字节。此外,如果您在结构上尝试此技巧,请注意您的编译器可能不会背对背打包值,尽管通常您可以使用pragma设置行为。例如,gcc / g ++将数据与我的架构中的32位对齐。
在C#上,BitConverter应该让你满意。我知道Python,PHP和Perl为此使用了一个名为pack()的函数,也许在Java中有一个等价物。