位移和数据说明

时间:2011-05-23 02:15:48

标签: c# java c++ c

好的,我想解释位移如何工作以及如何从字节数组构建数据。语言并不重要(如果需要一个例子,我知道C,C ++,Java和C# ,它们都遵循相同的转换语法,不是吗?)

问题是,如何从byte []到一堆字节一起? (16位整数,32位整数,64位整数,n位整数)更重要的是,为什么?我想了解并学习如何自己制作,而不是从互联网上复制。 我知道endianess,我主要讨论小端的东西,但解释两个系统的一般规则会很好。 非常非常感谢你!! 费德里科

4 个答案:

答案 0 :(得分:3)

我想说的是换位。 byte1<< n将字节1的位移位到左边n次,并且可以通过将byte1乘以2 ^ n得到结果...并且对于>> n,我们必须将byte1除以2 ^ n。

答案 1 :(得分:2)

嗯......这取决于你在寻找什么。实际上没有办法转换为n位整数类型(它始终是一个字节数组),但你可以将字节转换为其他类型。

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中有一个等价物。