如何在 C(最好)或 C++ 的字符数组或字符串中附加"%.2X"数据?
How to append "%.2X" data in char array or string in C (preferably) or C++?
我一直在尝试修复过去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);
}