Arrays “如何脱衣”\x";通过可重用函数从MAC地址(字符*)开始?
我认为我可以很容易地做到这一点,因为我正在做类似的事情Arrays “如何脱衣”\x";通过可重用函数从MAC地址(字符*)开始?,arrays,c,string,Arrays,C,String,我认为我可以很容易地做到这一点,因为我正在做类似的事情 uint8_t array[6] = {0x00, 0x0d, 0x3f, 0xcd, 0x02, 0x5f} 但是,事实证明,我还没有到那里 输入结构 char *MAC_ADDR = "\x00\x22\xC7\xFF\xFF\x27"; char *MAC_ADDR_NEW = "0022C7FFFF27"; 我想把它转换成 char *MAC_ADDR = "\x00\x22\
uint8_t array[6] = {0x00, 0x0d, 0x3f, 0xcd, 0x02, 0x5f}
但是,事实证明,我还没有到那里
输入结构强>
char *MAC_ADDR = "\x00\x22\xC7\xFF\xFF\x27";
char *MAC_ADDR_NEW = "0022C7FFFF27";
我想把它转换成强>
char *MAC_ADDR = "\x00\x22\xC7\xFF\xFF\x27";
char *MAC_ADDR_NEW = "0022C7FFFF27";
非常感谢您的输入。我不太清楚可重用函数的含义。也就是说,
您可以使用(非标准)asprintf
功能进行分配和转换,如下所示:
#include <stdio.h>
#include <stdint.h>
int main(void){
char *MAC_ADDR = "\x00\x22\xC7\xFF\xFF\x27";
char *MAC_ADDR_NEW;
asprintf (&MAC_ADDR_NEW, "%02x%02x%02x%02x%02x%02x",
(uint8_t)MAC_ADDR[0], (uint8_t)MAC_ADDR[1], (uint8_t)MAC_ADDR[2],
(uint8_t)MAC_ADDR[3], (uint8_t)MAC_ADDR[4], (uint8_t)MAC_ADDR[5]);
printf("%s\n", MAC_ADDR_NEW);
free(MAC_ADDR_NEW); /* Good software hygiene is to free what you allocate. */
/* You could reuse the same code again here for another conversion. */
return 0;
}
我不太清楚可重用函数的含义。也就是说,
您可以使用(非标准)asprintf
功能进行分配和转换,如下所示:
#include <stdio.h>
#include <stdint.h>
int main(void){
char *MAC_ADDR = "\x00\x22\xC7\xFF\xFF\x27";
char *MAC_ADDR_NEW;
asprintf (&MAC_ADDR_NEW, "%02x%02x%02x%02x%02x%02x",
(uint8_t)MAC_ADDR[0], (uint8_t)MAC_ADDR[1], (uint8_t)MAC_ADDR[2],
(uint8_t)MAC_ADDR[3], (uint8_t)MAC_ADDR[4], (uint8_t)MAC_ADDR[5]);
printf("%s\n", MAC_ADDR_NEW);
free(MAC_ADDR_NEW); /* Good software hygiene is to free what you allocate. */
/* You could reuse the same code again here for another conversion. */
return 0;
}
基于@Jonathan Leffler和@Jens的宝贵意见,为了完整起见,我放弃了我的经验证的答案 这是我已经测试并开始使用的函数
#include <stdio.h>
const unsigned char * MAC_HEX_TO_STR(char *MAC_ADDR);
const unsigned char * MAC_HEX_TO_STR(char *MAC_ADDR){
// If static is not used, due to local variable is destroyed out of the function will return gibberish!
static char memory[13];
static char *MAC_ADDR_NEW = memory;
snprintf(memory, sizeof(memory), "%.2X%.2X%.2X%.2X%.2X%.2X", (unsigned char)MAC_ADDR[0], (unsigned char)MAC_ADDR[1], (unsigned char)MAC_ADDR[2], (unsigned char)MAC_ADDR[3], (unsigned char)MAC_ADDR[4], (unsigned char)MAC_ADDR[5]);
//printf(" 1 ==>> %s\n ", MAC_ADDR_NEW); // Debug if you like
//MAC_ADDR_NEW[13] = 0; // I don't know, I tried with or without but no difference observed!
return MAC_ADDR_NEW;
}
int main()
{
char *MAC_ADDR = "\x00\x22\xC7\xFF\xFF\x27";
const unsigned char* RETURNED_MAC = MAC_HEX_TO_STR(MAC_ADDR);
printf(" RETURNED_MAC ==>> %s\n ", RETURNED_MAC );
return 0;
}
#包括
const unsigned char*MAC_HEX_TO_STR(char*MAC_ADDR);
常量无符号字符*MAC\U十六进制字符到字符串(字符*MAC\U地址){
//如果不使用static,由于局部变量被破坏掉,函数将返回乱码!
静态字符存储器[13];
静态字符*MAC_ADDR_NEW=内存;
snprintf(memory,sizeof(memory),“%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.”,(unsigned char)MAC_ADDR[0],(unsigned char)MAC_ADDR[1],(unsigned char)MAC_ADDR[2],(unsigned char)MAC_ADDR[3],(unsigned char)MAC_ADDR[4],(unsigned char)MAC ADDR[5]);
//printf(“1==>>%s\n”,MAC\u ADDR\u NEW);//如果愿意,请调试
//MAC_ADDR_NEW[13]=0;//我不知道,我试过带或不带,但没有发现任何差异!
返回MAC_ADDR_NEW;
}
int main()
{
char*MAC\u ADDR=“\x00\x22\xC7\xFF\xFF\x27”;
const unsigned char*返回的\u MAC=MAC\u HEX\u到\u STR(MAC\u ADDR);
printf(“返回的\u MAC==>>%s\n”,返回的\u MAC);
返回0;
}
您可以通过。基于@Jonathan Leffler和@Jens的宝贵输入,我放弃我的经验证的答案 这是我已经测试并开始使用的函数
#include <stdio.h>
const unsigned char * MAC_HEX_TO_STR(char *MAC_ADDR);
const unsigned char * MAC_HEX_TO_STR(char *MAC_ADDR){
// If static is not used, due to local variable is destroyed out of the function will return gibberish!
static char memory[13];
static char *MAC_ADDR_NEW = memory;
snprintf(memory, sizeof(memory), "%.2X%.2X%.2X%.2X%.2X%.2X", (unsigned char)MAC_ADDR[0], (unsigned char)MAC_ADDR[1], (unsigned char)MAC_ADDR[2], (unsigned char)MAC_ADDR[3], (unsigned char)MAC_ADDR[4], (unsigned char)MAC_ADDR[5]);
//printf(" 1 ==>> %s\n ", MAC_ADDR_NEW); // Debug if you like
//MAC_ADDR_NEW[13] = 0; // I don't know, I tried with or without but no difference observed!
return MAC_ADDR_NEW;
}
int main()
{
char *MAC_ADDR = "\x00\x22\xC7\xFF\xFF\x27";
const unsigned char* RETURNED_MAC = MAC_HEX_TO_STR(MAC_ADDR);
printf(" RETURNED_MAC ==>> %s\n ", RETURNED_MAC );
return 0;
}
#包括
const unsigned char*MAC_HEX_TO_STR(char*MAC_ADDR);
常量无符号字符*MAC\U十六进制字符到字符串(字符*MAC\U地址){
//如果不使用static,由于局部变量被破坏掉,函数将返回乱码!
静态字符存储器[13];
静态字符*MAC_ADDR_NEW=内存;
snprintf(memory,sizeof(memory),“%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.”,(unsigned char)MAC_ADDR[0],(unsigned char)MAC_ADDR[1],(unsigned char)MAC_ADDR[2],(unsigned char)MAC_ADDR[3],(unsigned char)MAC_ADDR[4],(unsigned char)MAC ADDR[5]);
//printf(“1==>>%s\n”,MAC\u ADDR\u NEW);//如果愿意,请调试
//MAC_ADDR_NEW[13]=0;//我不知道,我试过带或不带,但没有发现任何差异!
返回MAC_ADDR_NEW;
}
int main()
{
char*MAC\u ADDR=“\x00\x22\xC7\xFF\xFF\x27”;
const unsigned char*返回的\u MAC=MAC\u HEX\u到\u STR(MAC\u ADDR);
printf(“返回的\u MAC==>>%s\n”,返回的\u MAC);
返回0;
}
您可以从中访问测试。好吧,这并不是真正剥离
\x
——这是C编译器的唯一符号。您希望将6个字符的字符串转换为12个字符的字符串,其中每个原始字符由两个十六进制数表示。尝试替换字符串中的所有子字符串,我认为您可以通过将\x
替换为空字符串来适应您的需要。新MAC地址的内存分配在哪里?通过迭代调用snprintf()
基本操作非常简单,或者(假设以太网MAC地址始终为6个字节),您甚至可以使用对MAC地址中数据的6个显式订阅引用调用它一次(snprintf(buffer,sizeof(buffer))“%.2X%.2X%.2X%.2X%.2X%.2X”,MAC_ADDR[0],MAC_ADDR[1],MAC_ADDR[2],MAC_ADDR[3],MAC_ADDR[4],MAC_ADDR[5]);
)。问题是什么?我注意到uint8\u t数组[6]
和char*MAC\u ADDR
存在不同的问题。如果纯char
是有符号类型,则需要屏蔽或强制转换char*
表单,以避免出现负值问题(例如\xFF
)。因此,在我之前的评论中,我应该使用MAC_ADDR[0]&0xFF
或(unsigned char)MAC_ADDR[0]
作为传递给snprintf()
的参数。当数据已经是一个uint8\u t
数组时,不需要这样的掩蔽或强制转换。这两个都很好-但是在我使用sizeof(buffer)
的地方,我假设char buffer[13]代码>(或任何较大的数组大小),因为如果buffer
只是一个指针,那么sizeof(buffer)
的值将是8个字节(32位系统上为4个字节)。这并不是真正剥离\x
——这是C编译器的唯一符号。您希望将6个字符的字符串转换为12个字符的字符串,其中每个原始字符由两个十六进制数表示。尝试替换字符串中的所有子字符串,我认为您可以通过将\x
替换为空字符串来适应您的需要。新MAC地址的内存分配在哪里?通过迭代调用snprintf()
基本操作非常简单,或者(假设以太网MAC地址始终为6个字节),您甚至可以使用对MAC地址中数据的6个显式订阅引用调用它一次(snprintf(buffer,sizeof(buffer))“%.2X%.2X%.2X%.2X%.2X%.2X”,MAC_ADDR[0],MAC_ADDR[1],MAC_ADDR[2],MAC_ADDR[3],MAC_ADDR[4],MAC_ADDR[5]);
)。问题是什么?我注意到uint8\u t数组[6]
和char*MAC\u ADDR
存在不同的问题。如果纯char
是有符号类型,则需要屏蔽或强制转换char*
表单,以避免出现负值问题(例如\xFF
)。因此,在我之前的评论中,我应该使用MAC_ADDR[0]&0xFF
或(unsigned char)MAC_ADDR[0]
作为传递给snprintf()
的参数。当t