如何将long int转换为char

时间:2013-04-24 15:15:26

标签: winapi

#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;


HANDLE hPort = CreateFile("COM2",
GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
DCB dcb;

bool writebyte(char*data)
{
    DWORD byteswritten;
    if (!GetCommState(hPort,&dcb))
    {
        printf("\nSerial port can't be open\n");
        return false;
    }

    dcb.BaudRate = CBR_9600;
    dcb.ByteSize = 8;
    dcb.Parity = NOPARITY;
    dcb.StopBits = ONESTOPBIT;

    if (!SetCommState(hPort,&dcb))
        return false;

    bool retVal = WriteFile(hPort,data,1,&byteswritten,NULL);

    return retVal;
}

int ReadByte()
{

    int Val;
    BYTE Byte;
    DWORD dwBytesTransferred;
    DWORD dwCommModemStatus;
    if (!GetCommState(hPort,&dcb))
    return 0;

    SetCommMask(hPort,EV_RXCHAR | EV_ERR);
    WaitCommEvent (hPort,&dwCommModemStatus,0);
    if (dwCommModemStatus & EV_RXCHAR)
    ReadFile (hPort,&Byte,1,&dwBytesTransferred,0);
    Val = Byte;
    return Val;
}

int main() {

    POINT p;
    int x;
    int y;
    int z;


    while(0==0){
    GetCursorPos(&p);
    x = p.x;
    y = p.y;
    HDC hDC;

    hDC = GetDC(NULL);

    cin >> z;
    cout << GetPixel(hDC, x, y) << endl;
    Sleep(z);
    ReleaseDC(NULL, hDC);

    char data = GetPixel(hDC, x, y);
        if (writebyte(&data))
        cout <<" DATA SENT.. " << (int)data<< "\n";

    }
}

在通过串行通信发送数据的部分,而不是将数据作为GetPixel(hDC,x,y)发送,它只发送值“-1”。我以为这是因为char只用于小整数,而我输出的输出是一个非常长的数字。我试图将它改为long int但我仍然得到相同的结果。它只发送“-1”。我认为解决方案可能是在发送数据之前将char转换为long int或long int to char但我不知道怎么......有人可以帮助我吗?

1 个答案:

答案 0 :(得分:7)

为什么在发布后使​​用hDC?

ReleaseDC(NULL, hDC);
char data = GetPixel(hDC, x, y);

如果出现错误,GetPixel将返回-1(CLR_INVALID)(请参阅MSDN)。

顺便说一下,COLORREF不是char,因此在GetPixel中存储char data的返回值时会丢失信息。您应该存储完整的COLORREF并发送/接收所有字节(因此发送/接收sizeof(COLORREF)个字节)。

还要注意字节顺序。如果要在两台计算机之间传输多字节数据,则必须确保两者都同意字节的顺序。例如,如果一个机器是小端和另一个大端,则它们在内存中以不同的字节顺序存储COLORREF。一种是将COLORREF 0x00BBGGRR存储在内存中{ 0, 0xbb, 0xgg, 0xrr },而另一种将其存储为{ 0xrr, 0xgg, 0xbb, 0 }。因此,您需要定义一个发送字节顺序,双方使用它们的主机字节顺序。如果您不想发明新的轮子,可以查看网络字节顺序并重用它。 Socket API为您提供了一些函数,如ntohlhtonl,它们可以帮助您从主机字节顺序转换为网络字节顺序,反之亦然。