uint32_t转换成IP字符串

本文记录了在艺龙面试中遇到的一道题目,即如何将一个uint32_t类型的整数转换为IP地址字符串。通过解析每个八位段并处理不同情况,例如零填充和省略前导零,实现这一转换。提供的代码测试用例包括从0x0到0xFFFFFFFF以及一些随机数值。

今天去艺龙面试,面试的时候的一个面试题,题目是给一个uint32_t的一个整数,转换成IP字符串

 

大概思路是对的,每次取8位进行处理,然后字符串内加入一个'.',最后再用'\0'代替最后一个'.'

然后8位数字0-255,当然012这种0是不展现的,最后000的情况还需要补0,当时在纸上写的时候0处理得不够好,回来以后想了想,设一个flag标志表示是否前面已经有大于0的数,有的话'0' 就加入字符串,没有的话省略,最后如果flag没有被重置的话就补一个'0'。

大概思路就是这样,下面附上代码

测试用例用了0x0->0.0.0.0、0xFFFFFFFF->255.255.255.255

然后一些比较随机和综合的数0x0x64646464->100.100.100.100、0x66164E00->102.22.78.64

 

char* changeIP(uint32_t num){
	
	char *res=new char[16];
	char *p=res;
	for (int i=0;i<4;i++)
	{
		uint32_t tmp=(num>>((3-i)*8))&0xFF	 ;
		p=make8Bit(p,tmp);
	}
	p--;
	*p='\0';
	return res;
}
char* make8Bit(char *p,uint32_t num){
	//char *res=p;
	char *q=p;
	bool flag=false;
	for (int i=2;i>=0;i--)
	{
		int carry=num/pow(10,i);
		if (carry>0)
		{
			*(p++)=carry+'0';
			flag=true;
		}
		else{
			if(flag){
				 *(p++)=carry+'0';
			}
		}
		num = num % (int)pow(10,i);

	}
	if (!flag){
		*(p++)='0';
	}
	*(p++)='.';
	return p;
}


 

#pragma pack() typedef struct { LidarProtoType lidar_type; uint32_t handle; uint64_t base_time; uint32_t points_num; std::vector<PointXyzlt> points; } StoragePacket; typedef struct { LidarProtoType lidar_type; uint32_t handle; bool extrinsic_enable; uint32_t point_num; uint8_t data_type; uint8_t line_num; uint64_t time_stamp; uint64_t point_interval; std::vector<uint8_t> raw_data; } RawPacket; typedef struct { StoragePacket *storage_packet; volatile uint32_t rd_idx; volatile uint32_t wr_idx; uint32_t mask; uint32_t size; /**< must be power of 2. */ } LidarDataQueue; /*****************************/ /* About Extrinsic Parameter */ typedef struct { float roll; /**< Roll angle, unit: degree. */ float pitch; /**< Pitch angle, unit: degree. */ float yaw; /**< Yaw angle, unit: degree. */ int32_t x; /**< X translation, unit: mm. */ int32_t y; /**< Y translation, unit: mm. */ int32_t z; /**< Z translation, unit: mm. */ } ExtParameter; typedef float TranslationVector[3]; /**< x, y, z translation, unit: mm. */ typedef float RotationMatrix[3][3]; typedef struct { TranslationVector trans; RotationMatrix rotation; } ExtParameterDetailed; typedef struct { LidarProtoType lidar_type; uint32_t handle; ExtParameter param; } LidarExtParameter; /** Configuration in json config file for livox lidar */ typedef struct { char broadcast_code[16]; bool enable_connect; bool enable_fan; uint32_t return_mode; uint32_t coordinate; uint32_t imu_rate; uint32_t extrinsic_parameter_source; bool enable_high_sensitivity; } UserRawConfig; typedef struct { bool enable_fan; uint32_t return_mode; uint32_t coordinate; /**< 0 for CartesianCoordinate; others for SphericalCoordinate. */ uint32_t imu_rate; uint32_t extrinsic_parameter_source; bool enable_high_sensitivity; volatile uint32_t set_bits; volatile uint32_t get_bits; } UserConfig; typedef struct { uint32_t handle; int8_t pcl_data_type; int8_t pattern_mode; int32_t blind_spot_set; int8_t dual_emit_en; ExtParameter extrinsic_param; volatile uint32_t set_bits; volatile uint32_t get_bits; } UserLivoxLidarConfig; /** Lidar data source info abstract */ typedef struct { uint8_t lidar_type; uint32_t handle; // union { // uint8_t slot : 4; //slot for LivoxLidarType::kVehicleLidarType // uint8_t handle : 4; // handle for LivoxLidarType::kIndustryLidarType // }; uint8_t data_src; /**< From raw lidar or livox file. */ volatile LidarConnectState connect_state; // DeviceInfo info; LidarDataQueue data; LidarImuDataQueue imu_data; uint32_t firmware_ver; /**< Firmware version of lidar */ UserLivoxLidarConfig livox_config; } LidarDevice; constexpr uint32_t kMaxProductType = 10; constexpr uint32_t kDeviceTypeLidarMid70 = 6; /***********************************/ /* Global function for general use */ bool IsFilePathValid(const char *path_str); uint32_t CalculatePacketQueueSize(const double publish_freq); std::string IpNumToString(uint32_t ip_num); uint32_t IpStringToNum(std::string ip_string); std::string ReplacePeriodByUnderline(std::string str); } // namespace livox_ros #endif // LIVOX_ROS_DRIVER2_COMM_H_ 详细注释上述代码并保留原本注释
最新发布
09-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值