Конвертировать шестнадцатеричный LPCTSTR в BYTE в VS C ++ - PullRequest
0 голосов
/ 31 октября 2018

У меня есть функция ниже, которая поддерживает преобразование LPCTSTR в BYTE, но входная строка поддерживает только цифры на данный момент.

void StrToByte2(LPCTSTR str, BYTE *dest)
{
    UINT count = _ttoi(str);
    BYTE buf[4] = { 0 };
    char string[10] = { 0 };
    sprintf_s(string, 10, "%04d", count);
    for (int i = 0; i < 4; ++i)
    {
        if ((string[i] >= '0') && (string[i] <= '9'))
            buf[i] = string[i] - '0';
    }
    dest[0] = (BYTE)(buf[0] << 4) | buf[1];
    dest[1] = (BYTE)(buf[2] << 4) | buf[3];
}

Если я вызываю эту функцию на "1234" (любые цифры), dest выдает примерно 12814,

struct st               
{
    byte    btID[2];
    int     nID;
};

PTR ptr(new st);
StrToByte2(strCode, ptr->btID);

но когда я вызываю эту функцию в любом шестнадцатеричном формате, кроме A123, она всегда выдает 0000.

Функция ниже используется для преобразования обратно кода dest в str

CString Byte2ToStr(const byte* pbuf)
{
    CString str;
    str.Format(_T("%02X%02X"), pbuf[0], pbuf[1]);
    return str;
}

Как я могу получить A123 для преобразования в байты и затем обратно в str для отображения A123 ?? Пожалуйста, помогите !!

1 Ответ

0 голосов
/ 31 октября 2018
PTR ptr(new st);

Это утечка памяти в C ++, потому что new st выделяет память, и ее невозможно освободить.

UINT count = _ttoi(str);
...
sprintf_s(string, 10, "%04d", count);

Это преобразование строки в целое число, а затем преобразование целого числа обратно в строку. Кажется, у него нет настоящей цели.

Например, "1234" преобразуется в 1234 и обратно в "1234". Но "A123" не является допустимым числом, поэтому оно преобразуется в 0, а затем в "0000". Так что этот метод не работает. Вы можете просто работать с оригинальной строкой.

Кажется, эта функция пытается уместить 2 целых числа в 1 байт. Это можно сделать до тех пор, пока каждое значение меньше 16 или 0xF (я не знаю, для чего это нужно). Это можно исправить следующим образом:

void StrToByte2(const wchar_t* str, BYTE *dest)
{
    int len = wcslen(str);
    if(len != 4)
        return; //handle error
    char buf[4] = { 0 };
    for(int i = 0; i < 4; ++i)
        if(str[i] >= L'0' && str[i] <= L'9')
            buf[i] = (BYTE)(str[i] - L'0');
    dest[0] = (buf[0] << 4) + buf[1];
    dest[1] = (buf[2] << 4) + buf[3];
}

CStringW Byte2_To_Str(BYTE *dest)
{
    CStringW str;
    str.AppendFormat(L"%X", 0xF & (dest[0] >> 4));
    str.AppendFormat(L"%X", 0xF & (dest[0]));
    str.AppendFormat(L"%X", 0xF & (dest[1] >> 4));
    str.AppendFormat(L"%X", 0xF & (dest[1]));
    return str;
}

int main()
{
    BYTE dest[2] = { 0 };
    StrToByte2(L"1234", dest);
    OutputDebugStringW(Byte2_To_Str(dest));
    OutputDebugStringW(L"\n");
    return 0;
}

Если строка шестнадцатеричная, вы можете использовать sscanf для преобразования каждой пары символов в байты.

В основном "1234" изменяется на 12 34
"A123" изменяется на A1 23

bool hexstring_to_bytes(const wchar_t* str, BYTE *dest, int dest_size = 2)
{
    int len = wcslen(str);

    if((len / 2) > dest_size)
    {
        //error
        return false;
    }

    for(int i = 0; i < len / 2; i++)
    {
        int v;
        if(swscanf_s(str + i * 2, L"%2x", &v) != 1) 
            break;
        dest[i] = (unsigned char)v;
    }

    return true;
}

CStringW bytes_to_hexstring(const BYTE* bytes, int byte_size = 2)
{
    CString str;
    for(int i = 0; i < byte_size; i++)
        str.AppendFormat(L"%02X ", bytes[i] & 0xFF);
    return str;
}

int main()
{
    CStringW str;
    CStringW new_string;

    BYTE dest[2] = { 0 };

    str = L"1234";
    hexstring_to_bytes(str, dest);
    new_string = bytes_to_hexstring(dest);
    OutputDebugString(new_string);
    OutputDebugString(L"\n");

    str = L"A123";
    hexstring_to_bytes(str, dest);
    new_string = bytes_to_hexstring(dest);
    OutputDebugStringW(new_string);
    OutputDebugStringW(L"\n");

    return 0;
}
...