簡體   English   中英

如何將u32_t中的此十六進制值轉換為其對應的char / ascii值?

[英]How do I convert this hex value in a u32_t to its corresponding char/ascii value?

我正在嘗試從TCP堆棧讀取數據並使用數據來控制外部接口等。數據在u32_t中,因此如果我將“test”寫入接口,則十六進制值對應於0x74657374。 我想將此數據轉換為相應的字符,以便更容易使用數據。 如何將u32_t中的十六進制值轉換為其char字符串?

我試過直接通過%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。

最簡單的解決方案是獲取變量的地址,然后將其轉換為char*

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

您可能會遇到與字節序相關的問題。 這個答案有一個解決方案。

你有一個錯誤: 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'
};

鑒於:

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 ) ...

字符串轉換可能仍然有用,您希望輸出字符串以進行調試或人工演示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM