C 语言uint8转换成字符串,将uint8_t []转换为IP地址字符串

我目前正在学习C.我的生态系统包括Espressif ESP-32微控制器和Eclipse CDT IDE.

我试图将一个转换uint8_t[]为人类可读的IPv4 address string.到目前为止,我想出了以下代码:

void app_main() {

uint8_t[] ip = {192, 168, 0, 99};

dump_ip(ip);

}

void dump_ip(const uint8_t *in) {

// ip addresses consist of three dots + terminator '\0'

int size = 4;

// count amount of chars needed for specific ip address

for(int i=0; i<4; i++) {

if(in[i]==0) {

size ++;

} else {

size += ((int)log10(in[i]))+1;

}

}

// allocate memory on heap for an ip address of length 'size'

char *ip_str = (char*)malloc(size*sizeof(char));

// copy ip address parts to char array

int pos = 0;

for(int i=0; i<4; i++) {

if(in[i]==0) {

ip_str[pos] = '0';

pos++;

} else {

char b[4];

itoa(in[i], b, 10);

for(int j=0; j<3; j++) {

if(b[j]!='0') {

ip_str[pos] = b[j];

pos++;

}

}

}

// add dot between ip address parts

if(i<3) {

ip_str[pos] = '.';

pos++;

}

}

// add terminator at end of string

ip_str[pos] = '\0';

// print to uart interface

uart_send(ip_str);

// release allocated heap memory

free(ip_str);

}

在使用不同的IP阵列进行测试时,我得到以下结果:

uint8_t[] ip = {192, 168, 0, 99}; => "192.168.0.99" => OK

uint8_t[] ip = {192, 168, 1, 99}; => "192.168.1" => FAILED

uint8_t[] ip = {192, 168, 10, 99}; => "192.168.1" => FAILED

uint8_t[] ip = {10, 10, 10, 10}; => "1" => FAILED

// etc. etc. etc.

我究竟做错了什么?有没有更优雅的方法来实现这一目标?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值