【问题标题】:How to take 8 bits of int8 variable and put in the char variable?如何取 8 位 int8 变量并放入 char 变量中?
【发布时间】:2014-07-18 07:21:29
【问题描述】:

我有一个函数可以从 pkt 中提取一个 int8 变量。 还有另一个函数可以打印值,但它以 char 的形式输入。 现在我想获取该 int8 变量,将其转换为 char 格式,同时保留位,然后将该 char 变量输入到打印函数。我对类型转换的事情真的很怀疑,因为它并没有像看起来那样给我正确的结果。 这是代码。

void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{

  int8 test_rssi_value = pkt->rssi; // i want to do this & convert int8 to char type which I can input to HalUARTWrite
  unsigned char* Recv_RSSI = (unsigned char*)pkt->rssi; // I don't want to do this
  HalLedBlink  (HAL_LED_4, 4, 50, 250); 
  HalUARTWrite ( HAL_UART_PORT_0, Recv_RSSI, 1 );
}

uint16 HalUARTWrite ( uint8 port, uint8 *pBuffer, uint16 length )
{
--
}

谢谢 还有任何 ZStack 人可以帮助我解决这个问题: http://e2e.ti.com/support/wireless_connectivity/f/158/p/355391/1249087.aspx#1249087

【问题讨论】:

  • 你的代码有几个问题:首先你得到pkt->rssi作为一个普通的8位整数,然后在下一行你再次得到pkt->rssi,但这次是一个指针.不可能同时是两件事。如果pkt->rssi 实际上是一个 8 位整数,那么如果你想获得它的地址,你应该使用地址运算符 &,就像在 &pkt->rssi 中一样。
  • 另请注意,在几乎所有现代计算机上,char 都是 8 位。
  • 如果我这样做会怎样:int8 rssi_value = pkt->rssi;然后 char* pAdd = &rssi_value;然后使用 HALUartWrite(port,pAdd,1);或者这可能更正确。实际上我认为 (unsigned char*)pkt-rssi 会将 int8 类型转换为 char 但我认为我确实在那里犯了错误。让我试试新的东西。
  • 为什么不在通话中直接使用&pkt->rssi?不需要中间变量。
  • 非常感谢 :) !希望现在是正确的:)。有什么问题我会回复的。

标签: c type-conversion


【解决方案1】:

由于在大多数现代平台上char 是一个 8 位整数,因此诸如 int8_t 之类的 8 位类型实际上是基于 char。问题是char 的签名留给编译器来决定,因此对于某些编译器在例如charuint8_t 很简单,对于其他编译器来说,charint8_t 之间的转换很简单。由于签名/未签名问题,您仍然必须使用强制转换。

现在要解决您的问题,您实际上并不需要中间变量,或以任何形式使用char。使用地址运算符(一元 &),您可以简单地将指向 pkt->rssi 的指针直接作为参数传递给您的函数:

void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
    HalLedBlink  (HAL_LED_4, 4, 50, 250); 
    HalUARTWrite ( HAL_UART_PORT_0, (uint8 *) &pkt->rssi, 1 );
}

如果pkt->rssi 的类型已经 uint8,那么你甚至不必进行类型转换。

【讨论】:

    猜你喜欢
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多