C语言16进制转字符串,并从文件中查询到这个16进制字符串问题解析

C语言十六进制与字符串的快速转换 本文提供十六进制数据与字符串快速转换的方法。 阅读详情

编写了一个底层读取设备ID 并与到已有的库里面查询这个ID是否存在的测试代码。遇到了一些问题,在次进行分析一下,我的环境是ubuntu和android ndk,测试这段代码,两个有所不同:直接上代码:

#include <stdio.h>    
#include <string.h>
#include <stdlib.h>
//十六进制转换为字符,位转换
unsigned char HexToChar(unsigned char temp)
{
    unsigned char dst;
    if (temp < 10){
        dst = temp + '0';//数字小于10,就用‘0’字符加
    }else{
        dst = temp -10 +'a';//大于=10,就使用a或者A转换,即大小写
    }
    return dst;
}

int main(){
    int vid=0x2188;//设备VID
    int pid=0x0ae1;//设备VID
    int data = (vid << 16) +pid;//将设备VID和PID进行合并,就是四位16进制变成8位0x21880ae1
    unsigned char str[8];//用于存贮每一位16进制的数字
    char dst[8];//用于存贮每一位16进制的数字转换后的字符
    int i =0;
    int key = 0;//有无查找到的标志为
 //文件定义
    FILE * fp;
    int end =0;
    char * fileName = "/bhw/bhwusblist";//打开本地的库文件
    for(i=0;i<8;i++)
	{
	str[i] = (data >> (7-i)*4) & 0xf;//获取8位16进制的每一位数字	
	}
    
    for(i = 0; i<8;i++)
    {
        dst[i] = HexToChar(str[i]);//16进制转换为字符串
    }
    printf("%s\n",dst);	

//读取文件并在文件中搜索要查找的字符串

    if((fp = fopen(fileName, "rb")) == 0) {//打开库文件
        printf("Can't open %s, program will to exit.", fileName);
        exit(1);
    }
    fseek(fp, 0L, SEEK_END);// 移动到文件尾部
    end = ftell(fp);//获取文件大小
    char * all = (char *)calloc(end, sizeof(char));
    fseek(fp, 0L, SEEK_SET);// 移动到文件头部
    fgets(all, end, fp);//读取整个文件的内容到内存
    char *s = strstr(all, dst);//查找设备
    printf("all =%s\n",all);
    if(s==NULL) {printf("sssss \n"); key = 0;}//没有查找到
    else {printf("okkkkk\n"); key = 1;}//找到
    free(all);
        return 0;
}

在ubuntu下运行的结果是成功的的,如下图:

打印信息可以看到结果没问题的,也可以正常运行,这是当把这段代码在Android NDK 下编译后放到Android下运行的时候 就出问题了,问题是在16进制转换为字符串的时候出了问题,我的定义是 char ds[8]t;得到的应该是 “21880ae1”,但是得到的结果却是:“21880ae1@*d”,在已有的8位后面多了几个乱码,这样无论怎么样查找都不会成功,后来把定义改成char * dst;指针的方式可是依然由乱码,后来我定义了一个字符串然后打印,定义为char * dst1 = “adcdef12”;然后我同时打印:

__android_log_print(6,"usb-device-manager"," dst=%s dst1=%s %d---201800829",dst,dst1, strlen(dst));

这个打印就更奇怪了,如下

 dst=21880ae1@*d dst1=adcdef1221880ae1@*d 13---201800829

两个字符串居然都被dst1打出来了,依然由乱码,最后没办法解释这种现象,只好在字符串后面加结束符'\0':

dst[8]='\0';

可是我依然无法解释这个问题,只好在此记录仪下了

HamlibRotctl Easycomm协议C语言嵌入式解析库 Easycomm协议是业余无线电天线旋转器控制的通用串行通信标准,用于在上位机(如rotctl)与MCU控制器之间传输方位角、俯仰角及运动指令。其核心原理基于ASCII字符串命令的确定性解析与结构化映射,通过轻量级状态机实现协议版本(I/II/III)的无歧义识别。该协议的技术价值在于低资源开销、零动态内存依赖和强实时兼容性,特别适合在AVR、STM32、ESP32等裸机或RTOS环境中部署。典型应用场景包括自动跟踪天线系统、QRP便携站控制器及DIY卫星地面站。本文详解HamlibRotctlEasyco 阅读详情

相关推荐

C语言实现硬盘信息全面查询工具开发

在传统BIOS环境中,磁盘I/O操作主要通过软件中断INT 13h来实现。该中断提供了一组功能函数,用于执行软盘和硬盘的读写、检测容量、重置控制器等操作。早期版本仅支持CHS(Cylinder-Head-Sector)寻址方式,受限于最大寻址空间约为8GB。随着大容量硬盘普及,扩展INT 13h(Extended INT 13h)被引入,支持LBA(Logical Block Addressing)线性寻址,突破了此限制。// 示例:使用INT 13h读取第一个硬盘的第一个扇区。

weixin_42389113的博客 485

C语言把十六进制数据转换为字符串

创作人QQ:851301776,邮箱:lfr890207@163.com 欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 1.没有横空出世,只要厚积一定发。 2.你可以学历不高,你可以不上学,但你不能不学习 一、将数组中的十六进制数转换为字符串 1.概述 比如我们收到一包数据,数据为十六进制数(0xA1,0xB1,0xC1,0xD1),结果是:将此十六进制数据转换为字符串“A1B2C1D1”。用途:写日...

weixin_43155199的博客 1万+

modelsim软件安装教程及踩坑(极简版)

1.安装的网盘链接:链接:https://pan.baidu.com/s/1ltUfssyXlCnqDmLhWyhlwA提取码:jery 2.步骤(参考博文):https://blog.youkuaiyun.com/weixin_42693097/article/details/90523692?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163521788716780357213801%2522%252C%2522scm%2522%253A%2522

subtitle_的博客 3781

C语言将16进制字符数组转为字符串

数据为十六进制数(0xA1,0xB1,0xC1,0xD1),结果是:将此十六进制数据转换为字符串“A1B2C1D1”。方便用%s打印出来查看

阿乐的博客 8763

DP_AUX辅助通道介绍

DisplayPort(简称DP)是一个由PC及芯片制造商联盟开发,视频电子标准协会(VESA)标准化的数字式视频接口标准。其中辅助通道(AUX)是一条独立双向半双工的传输通道,它也是一对差分信号线。其数据传输速率1Mbps,用来传输配置参数与指令。

cjie221的博客 5363

电力远动入门:手把手解析IEC 60870-5-101规约的帧结构与报文交互(基于DL/T634.5101-2002)

本文深入解析IEC 60870-5-101规约的帧结构与报文交互,适用于电力远动通信系统。通过详细讲解规约的基础架构、控制域位定义及典型报文交互流程,帮助工程师快速掌握101规约的核心技术,提升电力自动化系统的调试与维护能力。

weixin_27076351的博客 246

[C语言] 16进制整数转字符串

本文系统讲解C语言中字符串与十六进制数据的三种核心转换方法:字符串转ASCII(解析十六进制字符串为字节)、字符串转hex(格式化字节为十六进制字符串)、16进制整数转字符串(将字节转为可读格式)。重点分析转换原理与规律,提供安全版代码实现,包含非法字符过滤、缓冲区溢出防护及奇偶长度校验。通过串口通信实战示例,展示其在嵌入式开发中的综合应用,并对比三者适用场景,帮助开发者高效、安全地完成底层数据处理。

嵌入式单片机实验室 1万+

从转发时钟到嵌入式时钟:CDR、CTLE与DFE在高速串行链路中的协同演进

本文深入探讨了高速串行链路中CDR、CTLE与DFE技术的协同演进。从转发时钟到嵌入式时钟的转变,详细分析了CDR的工作原理与实现架构,以及CTLE和DFE在信道损耗补偿和ISI干扰消除中的关键作用。通过实战案例展示了这些技术在28Gbps至112Gbps SerDes设计中的优化策略与性能提升。

weixin_42539414的博客 297

C语言将16进制的数转换为字符串的方法(改进)

  昨天写了一个方法,可以将嵌入式C常用的uint8_t数据转为一个字符,但是程序有警告,尴尬症发作甚是不爽,于是在今天解决了这个问题。昨天的博文   C语言中的char是一字节,也就是8个二进制位,正好可以表示成2个16进制的数。但是第一位是符号位,而单片机用的C语言中常常不牵扯...

weixin_40397257的博客 4879

YOLO126优化:损失篇 | AAAI 2025 | 一种基于尺度的动态(SD)损失,根据目标大小动态调整尺度和位置损失的影响,提高了网络检测不同尺度目标的能力

提出了一种基于尺度的动态(SD)损失,它根据目标大小动态调整尺度和位置损失的影响,提高了网络检测不同尺度目标的能力。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 448

BAT031:按列表名单将路径a下的文件夹批量剪切到路径b

摘要:按列表名单将路径a下的文件夹批量剪切到路径b。

qq_31762031的博客 1220

【C语言入门】字符串以及转义字符

为什么要用引号引起来呢—这是为了区别我们定义的变量名称,例如:我们定义了int a,而下面我们要用a作为一个字符,如果不用单双引号去区分,计算机不会知道你想应用的是什么,计算机就会默认你使用的是你定义的a的数值。这就是我们需要注意的问题,当我们定义ch时,我们用一个一个字符去存储,当我们定义ch2时我们采用的是字符串的形式,系统会默认存储了一个\0,\0是字符串的结束标志。程序越复杂,注释的价值越大。其转换规则和上面的类似,是将30两个十六进制的转化为10进制的ASCII码值,再将这个对应的数值打印出来。

RO-BERRY 7004

YOLO格式数据集【数据增强】终极脚本 | 70+种顶级数据增强方法 | 可带标签增强

YOLO格式数据集【数据增强】终极脚本 | 70+种顶级数据增强方法 | 可带标签增强

Coding... 5503

c语言ascii码字符串转16进制,C语言 16进制与ascii码互转

jquery获取table的行数、列数$("#grd").find("tr").length; //行数 $("#grd").find("tr").find( ...sql常见的面试题1.用一条SQL语句 查询出每门课都大于80分的学生姓名 name kecheng fenshu张三 语文 81张三 数学 75李四 语文 ...&amp...

weixin_42641869的博客 724

yocto系列讲解[实战篇]54 - 添加Qt5和生成带Qt5的SDK

为了满足读者盆友想看yocto如何添加qt5的需求,今天就开始尝试添加meta-qt5

fulinux的博客 3872

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

二进制文件分析之Linux下字符串优化对可执行文件影响(一)

作为一名软件开发,如何在开发迭代过程中减少软件二进制大小,进而降低我们所依赖的硬件成本是我们应该仔细考虑的。

牧羊人的博客 410

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

python16进制字节序_Python-十六进制数据传递与接收

实际应用场景python客户端与服务端(c程序)进行通讯,需接收服务端发来的16进制码流,并对16进制数据进行解码,得到相应字段的数据,并可以将数据打包成对应格式的码流发送给服务端,多字节整数传输采用网络字节序。1.1 网络字节序网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big e...

weixin_39888082的博客 1651

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C语言知识总结

文章目录1. 数据类型:2. 运算符3. 控制语句4. 输入输出5. 数组6. 字符串处理函数7. 函数8. 变量9. 指针10. 结构体1.结构体变量的定义方法2. 初始化结构3. 访问结构体成员11. 链表1. 存储空间的分配和释放2. 概述3. 静态链表和动态链表4. 单链表4.1 单链表的初始化4.2 单链表的建立4.3 单链表的遍历4.4 单链表的插入4.5 单链表的删除4.6 单链表的查询4.7 单链表的长度4.8 不带头结点的单链表5. 循环链表6. 双向链表 1. 数据类型: 常量:常

小周凉茶的博客 2169

十六进制转字符

本文介绍了一个Python脚本工具,用于快速解析反汇编中的UTF-8编码中文字符串。脚本通过正则表达式从输入文件中提取连续的十六进制字节,转换为UTF-8字符串输出,并自动处理字符串结束标志0x00。这种方法相比手动解析更高效,特别适合处理包含中文的二进制数据。作者还提供了使用示例和运行结果截图,展示了从十六进制数据到可读字符串的转换过程。

user_98765的博客 544

C语言转义字符深度解析:从原理到实战避坑指南

转义字符是编程语言中用于表示特殊字符或控制功能的通用机制,其核心原理是通过特定前缀(如反斜杠)改变后续字符的默认解释方式,从而在字符串或字符常量中嵌入无法直接键入的符号。理解转义机制对于处理字符串、文件路径和数据序列化至关重要,能有效避免编码错误和安全漏洞。在C语言中,转义字符分为控制字符、字面字符和数值编码等类别,广泛应用于格式化输出、路径表示和网络数据交换等场景。本文聚焦于C语言转义字符的实战应用,深入剖析了**格式化字符串漏洞**的成因与防范,并探讨了在**网络通信**中正确处理转义与反转义的重要性,

weixin_34408717的博客 298

C语言实现参数可变函数printf

C语言实现参数可变函数printf printf函数的功能相信不用多说,这应该是大家写代码用的最多的一个函数了,那它是怎么做到参数可变的呢。首先此功能实现可变参数的关键在于利用stdarg.h头文件中的三个函数 va_start() va_arg() va_end() 然后利用putchar函数输出字符到终端,看代码,我尽量把注释写详细。 #include <stdio.h> #include <stdarg.h> //函数声明 void printDec(int dec); v

mj475002864的博客 1109

c语言的入门知识

包括一些简单的语句简单概念说明和编译器的说明

liangmeirong123的博客 1256

DBF文件二进制格式深度解析与多语言读取实战指南

数据库文件是存储结构化数据的核心载体,其底层格式决定了数据的组织与访问效率。理解二进制文件格式的原理,是进行数据迁移、系统集成和历史数据分析的基础技术能力。从早期的dBase到现代关系型数据库,文件格式的演进体现了对存储效率与兼容性的持续追求。掌握二进制解析技术,不仅能处理遗留系统数据,更能深化对数据存储本质的理解,在数据工程领域具有广泛的应用价值。本文聚焦于经典的DBF文件格式,深入剖析其文件头、字段描述区和数据记录区的二进制结构,并针对数据迁移和遗留系统处理等常见场景,提供在Python、Java和C#

weixin_34221073的博客 507

揭秘IP地址与整数互转:C语言位运算的终极应用技巧

掌握C语言位运算实现IP地址转换技巧,高效解决网络编程中IP与整数互转难题。适用于Socket通信、IP处理等场景,提升运行效率,代码简洁可靠。值得收藏

PixelIsle的博客 660

C语言期末考试知识点

C语言中有一批保留的名字的符号,如:if、int、return这些符号称为保留字或关键字。有特殊意义,给C语言保留使用在创建标识符时不能与关键字重复关键字不能自己创建有关关键字的介绍可以在这个官网了解一下int main()int return;//这个写法是错误的,return作为关键字,不能作为标识符return 0;

Mz9665的博客 1080
上一篇: Netty学习和代码模板详解
下一篇: Visual Studio 2017:LNK1104 无法打开文件"LIBCMTD.lib" 解决方法
葫芦娃二娃
博客等级 码龄15年 1850粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值