【问题标题】:how to convert a 24 bit (integer value) to string and vice versa?如何将 24 位(整数值)转换为字符串,反之亦然?
【发布时间】:2012-04-27 12:21:06
【问题描述】:

我需要读取前 3 字节数据(24 位)并将其转换为十进制值。 例如。我的前三个字节是 0x00 0x00 0x0A 。 我需要阅读并获得 10 作为值。 我将输入作为字符串(c++ 字符串类)。我如何在 C++ 中做到这一点?

注意:整数值需要遵循大端表示。 我也无法生成输入。

编辑我的代码
用于生成:

  stringstream lss ;
   int lNo =32 ;     // I know its 32 bit integer value
   lss<<lNo ;   //string to int  
   // got output  in  lss.str()       as 32       . size of the string is 2 .
    // Expected out put is  0x00000020          size of the string should be 4 .. 

所以我也尝试了下面的代码

 stringstream lss ;
  char a[3] ={0x00,0x00,0x0A} ;
  lss<<a ;
 // this time output is empty string  ...

【问题讨论】:

  • 字符串中是否包含十六进制代码(如您在上面键入的内容)或实际的零值字节?
  • @MichaelAnderson 我添加了我尝试过的代码
  • @RandallCook 不,他们将只有位值而不是“十六进制字符串”。我必须读取 24 位。
  • 您想将FF FF FF 解释为16777215,还是-1?或者是 -8388607 或 -0?
  • @SteveJessop 我希望它是 16777215

标签: c++ string casting int


【解决方案1】:

我想你想要的是这样的:

unsigned char a[3] = { 0x00, 0x00, 0x0A };
int x = ((int)(char)a[0] << 16) | ((int)a[1] << 8) | a[2];`.

a 数组必须是无符号字符,这样在将它们向左移动之前将它们转换为整数时,它们不会被符号扩展。这不适用于第一个,因为它可能有一个有效的符号位。祝你好运。

【讨论】:

  • 或者使用long,如果你担心那种迂腐指出要适当便携的人,你需要long来确保至少32位;-)
  • 哦,我之前错过了。如果char 在实现上签名,这里就会出现问题。您应该在移位之前屏蔽每个字节,或者等效的方法。
  • 关于符号扩展的优秀评论,@Steve。我刚刚确定了我的答案。顺便说一句,在哪些平台上 int 不是 32 位,你必须在哪里使用 long
  • 16 位硬件将是查看的地方,例如 PIC。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 2012-05-01
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多