2010-09-24 91 views
2

所以我把一个整数转换成4个字节的数据。当字节shifitng一个int到4个字节后,我怎样才能移回int(C)

img[4] = (imagewidth >> 24) & 0xFF; 
img[5] = (imagewidth >> 16) & 0xFF; 
img[6] = (imagewidth >> 8) & 0xFF; 
img[7] = imagewidth & 0xFF; 

img[8] = (imageheight >> 24) & 0xFF; 
img[9] = (imageheight >> 16) & 0xFF; 
img[10] = (imageheight >> 8) & 0xFF; 
img[11] = imageheight & 0xFF; 

现在我该如何将其转移回整数。所以img[8] - img[11]回单intimg[4] - img[7]回单int

+0

我,如果我诱使你'imagewidth'和'imageheight'变量只是'int'正确。你应该让他们'unsigned'或者甚至更好'uint32_t',因为你假设32位。 – 2010-09-24 21:23:22

+0

确保'img []'被声明为'unsigned char'。如果不是这样,那么在执行算术将单个字节重新组合成更大的值时,您会碰到有趣的问题。 – RBerteig 2010-09-24 21:30:21

回答

9
imagewidth = img[4] << 24 | img[5] << 16 | img[6] << 8 | img[7]; 
imageheight = img[8] << 24 | img[9] << 16 | img[10] << 8 | img[11]; 
+0

希望'img []'被声明为'unsigned char',这样当每个字节在每次移位之前被提升为'int'时,你不会得到符号扩展。把它写成'img [4] << 24U | ...'将是一种让编译器更加清楚的方法,通过要求每个子表达式都提升为'unsigned int'而不是'int'来防止这种错误。 – RBerteig 2010-09-24 21:10:01

+2

@RBerteig:我认为换班的右操作数对结果类型没有影响,所以这没有帮助。对于负值左移只是未定义的行为。 – 2010-09-24 21:21:10

+0

@Jens,你是对的,换班的LHS控制着结果的类型,而不是RHS。而签名类型的左移则充满了未定义的行为。这加强了我的第一点。字节数组必须声明为'unsigned char',否则算术将调用未定义的行为。 – RBerteig 2010-09-24 21:27:00