如何在 C(最好)或 C++ 的字符数组或字符串中附加"%.2X"数据?

How to append "%.2X" data in char array or string in C (preferably) or C++?

本文关键字:字符串 2X 数组 数据 字符 最好 C++      更新时间:2023-10-16

我一直在尝试修复过去3天,并尝试了许多选择,但没有工作。我在C 中有以下代码。

    #include <winsock2.h>
    #include <iphlpapi.h>
    #include<stdio.h>
    #include <stdlib.h>
    #include <typeinfo>
    #include <string>

    // Link with Iphlpapi.lib
    #pragma comment(lib, "IPHLPAPI.lib")
    #define _CRT_SECURE_NO_WARNINGS
    #define WORKING_BUFFER_SIZE 15000
    #define MAX_TRIES 3
    #define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
    #define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
    /* Note: could also use malloc() and free() */
    int __cdecl main(int argc, char **argv)
    {
        /* Declare and initialize variables */
        DWORD dwSize = 0;
        DWORD dwRetVal = 0;
        unsigned int i = 0;
        // Set the flags to pass to GetAdaptersAddresses
        ULONG flags = GAA_FLAG_INCLUDE_PREFIX;
        // default to unspecified address family (both)
        ULONG family = AF_UNSPEC;
        LPVOID lpMsgBuf = NULL;
        PIP_ADAPTER_ADDRESSES pAddresses = NULL;
        ULONG outBufLen = 0;
        ULONG Iterations = 0;
        PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL;
        PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL;
        PIP_ADAPTER_ANYCAST_ADDRESS pAnycast = NULL;
        PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = NULL;
        IP_ADAPTER_DNS_SERVER_ADDRESS *pDnServer = NULL;
        IP_ADAPTER_PREFIX *pPrefix = NULL;
        // Allocate a 15 KB buffer to start with.
        outBufLen = WORKING_BUFFER_SIZE;
        std::string str;
        char Buffer[255];
        do {
            pAddresses = (IP_ADAPTER_ADDRESSES *)MALLOC(outBufLen);
            if (pAddresses == NULL) {
                printf
                    ("Memory allocation failed for IP_ADAPTER_ADDRESSES         structn");
                //exit(1);
            }
            dwRetVal =
                GetAdaptersAddresses(family, flags, NULL, pAddresses,         &outBufLen);
            if (dwRetVal == ERROR_BUFFER_OVERFLOW) {
                FREE(pAddresses);
                pAddresses = NULL;
            }
            else {
                break;
            }
            Iterations++;
        } while ((dwRetVal == ERROR_BUFFER_OVERFLOW) && (Iterations <         MAX_TRIES));
        if (dwRetVal == NO_ERROR) {
            // If successful, output some information from the data we         received
            pCurrAddresses = pAddresses;
            while (pCurrAddresses) {
                if (wcscmp(pCurrAddresses->FriendlyName, L"Ethernet") == 0)         {
                    if (pCurrAddresses->PhysicalAddressLength != 0) {
                        printf("tPhysical address: ");
                        for (i = 0; i < (int)pCurrAddresses-        >PhysicalAddressLength;
                        i++) {
                            if (i == (pCurrAddresses->PhysicalAddressLength         - 1)) {
                                printf("%.2Xn", (int)pCurrAddresses-        >PhysicalAddress[i]);
                                //str.append(pCurrAddresses-        >PhysicalAddress[i]);
                            //  str += (int)pCurrAddresses-        >PhysicalAddress[i];
                                //sprintf(Buffer + strlen(Buffer), "%.2X",         (int)pCurrAddresses->PhysicalAddress[i]);
                            }
                            else {
                                printf("%.2X-", (int)pCurrAddresses-        >PhysicalAddress[i]);
                                //str.append(pCurrAddresses-        >PhysicalAddress[i]);
                                //str += (int)pCurrAddresses-        >PhysicalAddress[i];
                            }
                        }
                    }
                }
                pCurrAddresses = pCurrAddresses->Next;
            }
        }
        else {
            printf("Call to GetAdaptersAddresses failed with error: %dn",
                dwRetVal);
            if (dwRetVal == ERROR_NO_DATA)
                printf("tNo addresses were found for the requested         parametersn");
            else {
                if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                    FORMAT_MESSAGE_FROM_SYSTEM |         FORMAT_MESSAGE_IGNORE_INSERTS,
                    NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL,         SUBLANG_DEFAULT),
                    // Default language
                    (LPTSTR)& lpMsgBuf, 0, NULL)) {
                    printf("tError: %s", lpMsgBuf);
                    LocalFree(lpMsgBuf);
                    if (pAddresses)
                        FREE(pAddresses);
                    //exit(1);
                }
            }
        }
        if (pAddresses) {
            FREE(pAddresses);
        }
        MessageBoxA(NULL, str.c_str(), "testx", MB_OK);
        system("pause");
        return 0;
            }

我想使用类型LPCSTR在MessageBox(Winapi)中打印MAC地址,而不是在循环中,因为它正在使用printf()进行。然后,我必须使用具有LPCSTR或LPWCSTR的数据类型的InternetOpenUrl()在URL中发送MAC地址,一旦我成功地以MessageBox和LPCSTR格式打印和存储MAC地址。>

编辑:我的问题是:1.如何将Mac地址的值附加到循环中的字符阵列或字符串中?2.如何将MAC地址存储在LPCSTR中以显示在MessageBox()?

char MAC[18] = {0};
if (pCurrAddresses->PhysicalAddressLength != 0) {
    // a MAC is usually 6 bytes in size...
    sprintf(MAC, "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X",
        pCurrAddresses->PhysicalAddress[0],
        pCurrAddresses->PhysicalAddress[1],
        pCurrAddresses->PhysicalAddress[2],
        pCurrAddresses->PhysicalAddress[3],
        pCurrAddresses->PhysicalAddress[4],
        pCurrAddresses->PhysicalAddress[5]);
    printf("tPhysical address: %sn", MAC);
    str.append(MAC);
}

如果您想"在政治上正确",则格式化PhysicalAddressLength报告的实际字节数(从技术上讲可以高达8):

char MAC[24] = {0};
if (pCurrAddresses->PhysicalAddressLength != 0) {
    char fmt[] = "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X:%.2X:%.2X";
    if (pCurrAddresses->PhysicalAddressLength < 8)
        fmt[(pCurrAddresses->PhysicalAddressLength * 5)-1] = 0;
    sprintf(MAC, fmt,
        pCurrAddresses->PhysicalAddress[0],
        pCurrAddresses->PhysicalAddress[1],
        pCurrAddresses->PhysicalAddress[2],
        pCurrAddresses->PhysicalAddress[3],
        pCurrAddresses->PhysicalAddress[4],
        pCurrAddresses->PhysicalAddress[5]
        pCurrAddresses->PhysicalAddress[6],
        pCurrAddresses->PhysicalAddress[7]);
    printf("tPhysical address: %sn", MAC);
    str.append(MAC);
}