在C中将int转换为2字节的hex值

我需要将int转换为2字节的hex值以存储在C数组中的char数组中。我该怎么做?

如果您被允许使用库函数:

int x = SOME_INTEGER; char res[5]; /* two bytes of hex = 4 characters, plus NULL terminator */ if (x <= 0xFFFF) { sprintf(&res[0], "%04x", x); } 

您的整数可能包含超过四位hex数字的数据,因此请先检查。

如果您不允许使用库函数,请手动将其分为nybbles:

 #define TO_HEX(i) (i <= 9 ? '0' + i : 'A' - 10 + i) int x = SOME_INTEGER; char res[5]; if (x <= 0xFFFF) { res[0] = TO_HEX(((x & 0xF000) >> 12)); res[1] = TO_HEX(((x & 0x0F00) >> 8)); res[2] = TO_HEX(((x & 0x00F0) >> 4)); res[3] = TO_HEX((x & 0x000F)); res[4] = '\0'; } 

假设int为32位;

最简单的方法:只使用sprintf()

 int intval = /*your value*/ char hexval[5]; sprintf(hexval,"%0x",intval); 

现在使用hexval [0]到hexval [3]; 如果要将其用作以null结尾的字符串,则添加hexval[4]=0;

 char s[5]; // 4 chars + '\0' int x = 4660; sprintf(s, "%04X", x); 

您可能想要检查sprintf()文档。 请注意,此代码不是很安全。 如果x大于0xFFFF ,则最终字符串将超过4个字符,并且不适合。 为了使其更安全,请查看snprintf()

通常我会建议使用其他人推荐的基于sprintf的解决方案。 但是当我编写一个必须将数十亿个项目转换为hex的工具时,sprintf太慢了。 对于该应用程序,我使用了256个元素数组,它将字节映射到字符串。

这是一个不完整的转换1字节的解决方案,不要忘记添加边界检查,并确保数组是静态的或全局的,重新创建它会导致每次检查都会导致性能下降。

 static const char hexvals[][3]= {"00", "01", "02", ... "FD", "FE", "FF"}; const char *byteStr = hexvals[number]; 

想出了一个我测试过的快速方法,它的工作原理。

 int value = 11; array[0] = value >> 8; array[1] = value & 0xff; printf("%x%x", array[0], array[1]); 

结果是:

 000B 

这是hex的11。

而不是sprintf ,我建议使用snprintf

 #include  int main() { char output[5]; snprintf(output,5,"%04x",255); printf("%s\n",output); return 0; } 

它更安全,几乎每个编译器都可用。

 void intToHex(int intnumber, char *txt) { unsigned char _s4='0'; char i=4; //intnumber=0xffff; do { i--; _s4 = (unsigned char) ((intnumber >> i*4 ) & 0x000f); if(_s4<10) _s4=_s4+48; else _s4=_s4+55; *txt++= _s4; } while(i); } ... char text [5]={0,0,0,0,0}; ... intToHex(65534,text); USART_Write_Text(text); .... 

也许尝试这样的事情:

 void IntToHex(int value, char* buffer) { int a = value&16; int b = (value>>4)&16; buffer[0] = (a<10)?'0'+a:'A'-(a-10); buffer[1] = (b<10)?'0'+b:'A'-(b-10); } 

这些答案中的大多数都很棒,我只需要添加一件事:您可以使用sizeof安全地保留正确的字节数。 每个字节最多可以包含两个hex数字(255 – > ff),因此每个字节有两个字符。 在这个例子中,我为’0x’前缀添加两个字符,为尾随NUL添加一个字符。

 int bar; // ... char foo[sizeof(bar) * 2 + 3]; sprintf(foo, "0x%x", bar); 
 unsigned int hex16 = ((unsigned int) input_int) & 0xFFFF; 

input_int是您要转换的数字。 hex16将具有hex16的最不重要的2个字节。 如果要将其打印到控制台,请使用%x作为格式说明符而不是%d ,它将以hex格式打印。

这是一种粗暴的做法。 如果我们不能相信ascii值的编码是连续的,我们只需在char中创建hex值的映射。 可能可以优化,整理,并使其更漂亮。 还假设我们只看到捕获最后的32位== 4个hex字符。

 #include  #include  #define BUFLEN 5 int main(int argc, char* argv[]) { int n, i, cn; char c, buf[5]; char hexmap[17] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','.'}; for(i=0;i\n", argv[0]); return 1; } n = atoi(argv[1]); i = 0; printf("n: %d\n", n); for(i=0; i<4; i++) { cn = (n>>4*i) & 0xF; c = (cn>15) ? hexmap[16] : hexmap[cn]; printf("cn: %d, c: %c\n", cn, c); buf[3-i] = (cn>15) ? hexmap[16] : hexmap[cn]; } buf[4] = '\0'; // null terminate it printf("buf: %s\n", buf); return 0; } 

这个function就像一个魅力。

 void WORD2WBYTE(BYTE WBYTE[2], WORD Value) { BYTE tmpByte[2]; // Converts a value from word to word byte ---- memcpy(tmpByte, (BYTE*) & Value, 2); WBYTE[1] = tmpByte[0]; WBYTE[0] = tmpByte[1]; } 

asumming以下:

 typedef unsigned char BYTE; typedef unsigned short WORD; 

使用示例:

我们想实现这个目标:

 integer = 92 byte array in hex: a[0] = 0x00; a[1] = 0x5c; unsigned char _byteHex[2]; WORD2WBYTE(_byteHex, 92); 

你可以使用它,它很简单,易于转换

 typedef union { struct hex{ unsigned char a; unsigned char b; }hex_da; short int dec_val; }hex2dec; hex2dec value; value.dec_val=10; 

现在hex值存储在hex_da结构中,以便进一步使用。

使用Vicky的答案

 typedef unsigned long ulong; typedef unsigned char uchar; #define TO_HEX(i) (i <= 9 ? '0' + i : 'A' - 10 + i) #define max_strhex (sizeof(ulong)*2) public uchar *mStrhex(uchar *p, ulong w, ulong n) { ulong i = 0xF; // index ulong mask = i << (((sizeof(ulong)*2)-1)*4); // max mask (32 bit ulong mask = 0xF0000000, 16 bit ulong mask = 0xF000) ulong shift = (w*4); // set up shift to isolate the highest nibble if(!w || w > max_strhex) // no bold params return p; // do nothing for the rebel mask = mask >> (max_strhex-w)*4; // setup mask to extract hex nibbles for(i = 0; i < w; i++){ // loop and add w nibbles shift = shift - 4; // hint: start mask for four bit hex is 0xF000, shift is 32, mask >> 32 is 0x0000, mask >> 28 is 0x000F. *p++ = TO_HEX(((n & mask) >> shift)); // isolate digit and make hex mask = mask >> 4; // *p = '\0'; // be nice to silly people } // return p; // point to null, allow concatenation } 

对于动态固定长度的hex

 string makeFixedLengthHex(const int i, const int length) { std::ostringstream ostr; std::stringstream stream; stream << std::hex << i; ostr << std::setfill('0') << std::setw(length) << stream.str(); return ostr.str(); } 

但是否定你必须自己处理它。