【问题标题】:Converting char[][] to char[] in C++在 C++ 中将 char[][] 转换为 char[]
【发布时间】:2015-12-22 19:25:54
【问题描述】:

现在我有一个 char 数组,其中存储了 mac 地址:

char mac_addr[6];

然后我将sprintf 放到另一个字符数组中:

char cmdstr[64];
sprintf(cmdstr, "MAC: %2x:%2x:%2x:%2x:%2x:%2x;",
mac_addr[0], mac_addr[1], mac_addr[2],
mac_addr[3], mac_addr[4], mac_addr[5]);

当我打印cmdstr 时,它看起来像这样:

MAC: 08:10:76:10:26:21;

然后我将cmdstr 发送到远程服务器,有一个解析函数来解析这个字符数组。解析cmdstr后,将:分隔的六个部分存储在一个多字符数组中:

char mac[6][10];

与:

char mac[0] = "08"
char mac[1] = "10"
char mac[2] = "76"
char mac[3] = "10"
char mac[4] = "26"
char mac[5] = "21"   

现在,在服务器端,我怎样才能将mac地址的每个部分重新转换为char,并使整个mac地址可以存储在这样的char数组中?

char my_mac[6];

与:

my_mac[0] = '08'
my_mac[1] = '10'
my_mac[2] = '76'
my_mac[3] = '10'
my_mac[4] = '26'
my_mac[5] = '21'

非常感谢!

编辑:

抱歉,我认为我描述的有些错误,文本 '08' 本身不应该存储在 my_mac[0] 中。实际上,当我 gdb 程序时,我发现:

(gdb) p mac_addr[0]
$15 = 8 '\b'
(gdb) p mac_addr[1]
$16 = 16 '\020'
(gdb) p mac_addr[2]
$17 = 118 'v'
(gdb) p mac_addr[3]
$18 = 16 '\020'
(gdb) p mac_addr[4]
$19 = 38 '&'
(gdb) p mac_addr[5]
$20 = 33 '!'

我想我应该像上面一样将mac[6][10] 转换为 char 数组。

【问题讨论】:

  • '08' 是 2 个字符。是要将数字存储为 2 个字符的文本,还是将实际整数存储在 char 变量中?
  • @NeilKirk 我想我需要将它存储为文本。
  • @Xing 你为什么这么认为? mac_addr 应该包含%02x 的实际整数,并且您说“重新转换”。不是说要把地址保存到my_mac,格式和mac_addr一样吗?
  • @Xing 我知道了,需要存储为文本的应该来自​​“like this”。而且我认为它无法实现,因为char 只能存储一个字符。
  • @MikeCAT 是的,我认为你是对的,我应该在下次发短信之前多考虑一下 = =

标签: c++ c arrays char


【解决方案1】:

你可以在stdlib.h中使用strtol函数

char *dummy;
for (int i = 0; i < 6; i++) {
    my_mac[i] = strtol(mac[i], &dummy, 16);
}

【讨论】:

  • 这个解决方案没有错误检查。如果传入地址格式错误怎么办?
  • 对不起,这不是答案。此代码存储类似于my_mac[0] = 0x08,而不是指定的my_mac[0] = '08'
  • 我认为这实际上是他想要的,因为他要求原始 char[6],并且只有 6 字节的二进制形式适合 6 个字符。他原来的 char[6] 是用 sprintf 从二进制转换为文本的,看起来他只是想反序列化回这个(二进制)形式。当他写my_mac[0] = '08'时,他的意思可能是my_mac[0] = '\x08'
  • @MikeCAT strtol() 刚刚完成了这项工作。我做的另一件事是在strtol() 操作之后将十六进制转换为十进制。终于得到了一个和mac_addr[6]一模一样的char数组,谢谢!
猜你喜欢
  • 2021-11-30
  • 2012-07-01
  • 1970-01-01
  • 2013-12-31
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多