如何将u32_t中的十六进制值转换为其相应的char / ascii值?

时间:2019-04-25 11:56:10

标签: c embedded

我正在尝试从TCP堆栈读取数据,并使用该数据控制外部接口等。数据在u32_t中,因此,如果我在该接口中写入“ test”(例如),则十六进制值对应于0x74657374。我想将此数据转换为相应的字符,以便更轻松地使用数据。如何将u32_t中的十六进制值转换为其字符字符串?

我尝试通过%c格式说明符直接打印数据,但随后仅显示字符串的第一个字符。

/* indicate that the packet has been received */
tcp_recved(tpcb, p->len);
// Put actual data in 32 bit unsigned integer.
tempPtr = (u32_t*)p->payload;
// Print length of the actual data.
xil_printf("Received package. Length = %d \r\n", p->len);
// Reverse the data so it corresponds to the data sent.
u32_t reversedTemp = byte_reverse_32(*tempPtr);

// Prints hex value of data
xil_printf("Data: %08x \r\n",reversedTemp);

if (reversedTemp == 0x6C656431) { /* Read "led1" */
    xil_printf("Data Read: led1");
} else if (reversedTemp == 0x74657374) { /* Read "test */
    xil_printf("Data Read: test");
}

所以在if语句中使用完整的十六进制值的地方,我只想使用字符串值。因此,对于检查测试,应该使用==“ test”而不是== 0x74657374。

3 个答案:

答案 0 :(得分:0)

最简单的解决方案是获取变量的地址,然后将其转换为char*

if (memcmp("test", tempPtr), 4) {
    // The input was "test"
}

您可能会遇到与endianness相关的问题。 This answer对此有所解决。

答案 1 :(得分:0)

您在这里有一个错误:tempPtr = (u32_t*)p->payload; ... byte_reverse_32(*tempPtr)。这是一个严格的别名冲突,很可能也是未对齐的访问。不要这样做。

由于您打算将它们转换为字符串(?),因此显然不需要交换字节来补偿字节性。如果是这样,您可以改为这样做(假设网络为大端,CPU为小端):

tcp_recved(tpcb, p->len);
char str[4+1] =
{
  [0] = p->payload[3];
  [1] = p->payload[2];
  [2] = p->payload[1];
  [3] = p->payload[0];
  [4] = '\0'
};

答案 2 :(得分:0)

给出:

uint32_t num = 0x74657374 ;

然后:

char str[5] = {0} ;
str[0] = num >> 24 ;
str[1] = (num >> 16) & 0xff ;
str[2] = (num >> 8) & 0xff ;
str[3] = num & 0xff ;

字节反转可能是不必要的,当第一个字符在LSB中时,您可以简单地反转拆包以一步一步获得字符串:

char str[5] = {0} ;
str[0] = num & 0xff ;
str[1] = (num >> 8) & 0xff ;
str[2] = (num >> 16) & 0xff ;
str[3] = num >> 24 ;

对于以下任一情况,

  • 大端目标和MSB中的第一个字符,或者
  • 小尾数目标和LSB中的第一个字符

然后只是:

char str[5] = {0} ;
memcpy( str, &num, 4 ) ;

在这种情况下,所有这些说明了您现有的解决方案比字符串或内存比较更有效。但是同样,字节反转是不必要的-只需反转整数中的字节顺序,并避免使用“幻数”:

#define TEST 0x74736574u ;  // "tset" ("test" reversed)

...

uint32_t temp = *((u32_t*)p->payload) ;
if( temp == TEST ) ...

如果您要输出用于调试或人工演示的字符串,则字符串转换可能仍然有用。