【问题标题】:Convert char to byte c++将 char 转换为字节 c++
【发布时间】:2014-02-18 09:10:01
【问题描述】:

我正在尝试将 char 数组转换为 Byte(微软类型,我正在使用 Visual Studio)。事实上,我想为串行端口通信填写一个DCB 结构,然后我从一个.ini 文件中取回信息。数据保存在 char 临时缓冲区中。 DCB 端口设置中的某些值需要以字节为单位。我尝试了很多方法都没有成功。从 .ini 中很好地检索了数据,但我在将它们转换为字节时遇到了一些问题。

我可以将数值转换为整数,但它们也必须是字节。

并且 process->read 方法是 GetPrivateProfileString 的个人实现。

char res[10];
printf("\nReading port settings of %s\n", comName);
processFileConfig->read(comName, "baudrate", "9600", res, sizeof(res));
baudr = atoi(res);

processFileConfig->read(comName, "parity", "N", res, sizeof(res));
parity = (BYTE)res;
std::cout << "size of Parity : ";
std::cout << sizeof(parity) <<std::endl;
std::cout << "content of Parity : ";
std::cout << parity <<std::endl;

processFileConfig->read(comName, "byteSize", "8", res, sizeof(res));
byteSize = atoi(res);
std::cout << "biteSize : ";
std::cout << byteSize <<std::endl;


processFileConfig->read(comName, "stopBits", "1", res, sizeof(res));
stopBits = atoi(res);
std::cout << "stopBits : ";
std::cout << stopBits <<std::endl;

portSettings.DCBlength = sizeof(portSettings);
portSettings.BaudRate = baudr; //this one is OK
portSettings.ByteSize = byteSize; // returns 
portSettings.Parity = parity; // returns nothing
portSettings.StopBits = stopBits; // returns a smiley :)

还有一个我的file.ini 的例子:

[COM1]
baudrate=15000
byteSize=8
stopBits=1
parity=N

编辑:res 缓冲区从 .ini 中返回好的值。这边一切正常。我只需要将最后三个值(byteSize、stopBits 和 parity)转换为 unsigned long。

【问题讨论】:

  • 你所说的“一些问题”是什么意思,你必须具体。 “WinAPI Byte”上的简单 google 指向 MSND,其中声明 “BYTE - 一个字节(8 位)。这种类型在 WinDef.h 中声明如下:typedef unsigned char BYTE;”。我什至不确定你会遇到什么问题。
  • “一些问题”:好吧,我无法转换它:p 我还观看了带有 unisgned long 的 msdn 字节。我试图将返回的缓冲区(res)转换为无符号长缓冲区。
  • 好吧@Mr。斯塔克,你似乎甚至不知道出了什么问题。你有点帮不上忙。我很想说“是的,你可以!你只需要相信自己。”但取而代之的是专业的“请发布错误消息,或预期的和实际的输出。最好使用工作 sscce。”
  • xD 我尝试了很多东西,但我总是迷失在数据类型转换中。如果你有一个额外的链接来解释我接受它;) 为了重新表述我的问题,我会说我想将一个 char 数组转换为一个 unsigne long 值。
  • 您知道GetPrivateProfileInt 会为您读取这些数字,对吧?

标签: c++ byte type-conversion


【解决方案1】:

您当前的代码尝试将指向缓冲区的指针转换为BYTE。您需要做的是使用strtoul() 解析缓冲区,并将that 转换为BYTE

【讨论】:

    【解决方案2】:

    好的,我明白了。终于轻松了,不知道为什么屏蔽了^^ 我创建了一个中间 unsigned long var :

    processFileConfig->read(comName, "parity", "N", res, sizeof(res));
    unsigned long parity_ul = res[0];
    parity = parity_ul;
    std::cout << "parity : "; // 78 for 'N'
    std::cout << parity <<std::endl;
    
    portSettings.Parity = parity;
    
    std::cout << "Parity : ";
    std::cout << portSettings.Parity <<std::endl; // 'N' that's OK !
    

    我对其他无符号值做了同样的事情。我直接将 atoi(res) 的隐式转换(我想这是术语)转换为 unsigned long 值。根据 VS 调试器,在 portSettings 中正确输入了值,但是当我尝试打印它们时它失败了。这并不完美,但如果代码有效,我认为没关系。

    谢谢大家

    【讨论】:

      猜你喜欢
      • 2011-04-16
      • 1970-01-01
      • 2011-07-02
      • 2012-07-01
      • 1970-01-01
      • 2018-03-27
      • 2013-05-13
      • 2021-04-17
      • 2012-01-16
      相关资源
      最近更新 更多