如何从一个int变量(存储在int变量十六进制值)提取的字节?

问题描述 投票:1回答:4

即时试图提取从存储在int变量的十六进制值的4个字节。

我的想法是“推”,通过使用向右移位运算符(>>)希望字节到最后,然后使用AND运算符使用0xFF值来获得唯一的价值最后8位。与数值其工作正常(73例如),但其不与值A-F(3F例如)工作。我一直在使用不同格式的printf,比如%02X试过,我也试图改变的面具和运营商0x000000FF。

int variable = 0x12cd34f4; 
char byte0, byte1, byte2, byte3; 

byte0 = (char)(variable & 0xFF);
byte1 = (char)((variable >> 8) & 0xFF);
byte2 = (char)((variable >> 16) & 0xFF);
byte3 = (char)((variable >> 24) & 0xFF);

printf("%x\n",byte0);// prints fffffff4 
printf("%x\n",byte1);// prints 34
printf("%x\n",byte2);//prints ffffffcd
printf("%x\n",byte3);//prints 12

我期望它来打印F4为字节0,34字节1,CD的字节2和12字节3,但对于字节0实际产量FFFFFFF4和字节2个ffffffcd。我不明白为什么添加这些的F值,以及我怎样才能摆脱他们。

c hex bitwise-operators
4个回答
3
投票

char可符号或无符号,即依赖于系统(并且,也许,以及依赖于编译器选项)。

你的情况,这显然是signed0x800xFF(而不仅仅是从0xA0开始!)之间的值有位#7组和被解释为符号值(例如,0xFF的是-1,0XF0是-16,等)。

当扩展他们int(这是调用printf()时会发生什么),它们是符号扩展(这是什么Fs来自),从而保持其“解读价值”。 printf(),然而,被告知要再次把他们当作无符号,所以-16被表示为0xFFFFFFF0

要么使用unsigned char RESP。 uint8_t或致电& 0xFF时添加printf()


2
投票

正义的力量字符是无符号:

#include <stdio.h>

int main()
{
  int variable = 0x12cd34f4; 
  unsigned char byte0, byte1, byte2, byte3; 

  byte0 = (char)(variable & 0xFF);
  byte1 = (char)((variable >> 8) & 0xFF);
  byte2 = (char)((variable >> 16) & 0xFF);
  byte3 = (char)((variable >> 24) & 0xFF);

  printf("%x\n",byte0);
  printf("%x\n",byte1);
  printf("%x\n",byte2);
  printf("%x\n",byte3);
}

编译和执行:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra c.c
pi@raspberrypi:/tmp $ ./a.out
f4
34
cd
12

需要注意的是& 0xFF是无用的,当一个字符有8位


2
投票

首先,%x格式说明,没有任何修饰,对自己,是该类型unsigned int,这显然你的系统是32位。

的字节F4CD最显著位是1。这是符号位,所以它是符号扩展为完整的32位(因此FFFFFF),其打印出来。

注意,当你打印出来作为%d,你看到在游戏符号位太:

-12
52
-51
18

为了解决这个问题,可以使型unsigned char的字节,做一个按位和与printf每个0xFF参数,并使用正确的格式指定为十六进制的unsigned char,这是%hhX


2
投票

你的字节变量声明为char,这对大多数实现签订。当您将这些值来printf,它不知道你通过什么样的,因为它是一个可变参数函数的确切类型。所以char参数提升为int。因为你有哪些是负值,他们得到符号扩展作为推广活动的一部分。

更改这些变量的类型unsigned char。当正值然后晋升为int不会有符号扩展。

© www.soinside.com 2019 - 2024. All rights reserved.