Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays “如何脱衣”\x";通过可重用函数从MAC地址(字符*)开始?_Arrays_C_String - Fatal编程技术网

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