Char[] 引起的 unsigned shot* 转 char* 的错误

本文详细解释了在Unicode编码环境下,char数组如何转变成为unsigned short数组,并探讨了宽字符格式及如何使用WideCharToMultiByte函数将Unicode字符串转换为多字节字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最终查找到原因,存放UNICODE   STRING后就不是char 而是unsigned   short,存入,取都要按照unsigned   short来做  因此Unicode编码下,char[]属于宽字符格式。转成多字节的字符串需要用WideCharToMultiByte函数。

 
/* * bootloader.c * * Created on: 2022-4-24 * Author: Administrator */ #include "bootloader.h" #include "flash.h" #include "instruments.h" #include "stdio.h" #include "watchdog.h" #include "sev_usart.h" #include "LCD.h" static unsigned char head_buf[MSGLEN]={0}; unsigned char bin_buf[FRAME_SIZE]={0}; static unsigned char src_code[BIN_FILE_FRAME_SIZE]={0,0}; static unsigned char checkCnt = 0; static unsigned char MsgCnt = 0; static int infocrc_error = 0; // 信息段中92个有效字节的CRC校验出错 static int flashW_error = 0; //flash写入错误 static int boot_err_info = 0; //写flash过程中出现过错误 static int uart_Timeout_error = 0; //串口接收超时 static int Framecrc_error = 0; //帧尾CRC校验错误 static int uart_RecCnt_error = 0; //帧数接收错误 enum updata_flag updata_complete; //升级完成标志 uint32_t *const updataFlag = (uint32_t*)(0x10000000); #pragma pack(push,1) boot_shot_header head_info; #pragma pack(pop) extern struct rt_ringbuffer rb_usart2_rx; //字符串常量的定义 unsigned char state_info[][20]= { {"state_null"}, {"State_Pre"} , {"State_Check"} , {"State_Erease_Write"} , {"State_Crc_Record"} , {"state_Done"} , {"State_none"},//不需要升级 }; unsigned char *boot_error[]={ "err_time_out", "err_platform", "err_3times", "err_flash_write", "err_crc", "err_flash", "err_flash_bad", "err_not_first", }; /*---------------------------------升级数据协议--------------------------------- 7F 7E 00 CRC16 //MCU开机启动间隔一秒发送重启成功进入boot指令; 7F 7E 01 XX XX YY YY ... ... CRC16 //模块回复总包数 当前包数 数据,每包有效数据4096字节,每一包数据前面都有两个标签一个是总包数,一个是当前包序号 7F 7E 02 01 CRC16 //MCU接收成功 7F 7E 02 00 CRC16 //MCU接收失败 7F 7E 03 CRC16 //接收完成 */ uint8_t com_string[4][14]={ {0x55,0xAA,0x01,0x00,0x0c,0x01,0x00,0x02,0x00,0x00,0x00,0,}, {0x55,0xAA,0x01,0x00,0x0d,0x01,0x00,0x02,0x01,0x02,0x01,0,0,}, {0x55,0xAA,0x01,0x00,0x0d,0x01,0x00,0x02,0x01,0x02,0x00,0,0,}, {0x55,0xAA,0x01,0x00,0x0c,0x01,0x00,0x02,0x00,0x03,0x00,0,}, }; //字符串常量的定义 static uint32_t CRCAll = 0; unsigned char Date[10]=__TIME__;//记录升级日期 uint8
最新发布
03-19
我是使用的libusb获取的触摸点数据,如下: TOUCH_EVENT mPSign; //签名数据容器 QVector<TOUCH_EVENT> vecSignInfo1; //创建一个线程读取坐标数据函数 pthread_t thread; // 全局控制标志 volatile int keep_running = 1; // 接收数据的函数 int readHIDPenData(struct libusb_device_handle *dev_handle, unsigned char *data, int length) { int transferred; int ret; if (libusb_claim_interface(m_devHandle, 0) != LIBUSB_SUCCESS) { return 1; } // 端点 0x81 通常是 IN 端点,负责接收数据(需要根据设备实际情况调整) ret = libusb_interrupt_transfer(dev_handle, 0x81, data, length, &transferred, 5000); // 超时时间 5000ms if (ret != LIBUSB_SUCCESS) { fprintf(stderr, "Failed to receive data: %s\n", libusb_error_name(ret)); return ret; } libusb_release_interface(m_devHandle, 0); return transferred; } // 线程函数 void* readXYP(void* arg) { unsigned char penBuf[10] = {0x00}; int ret; while (keep_running) { if (m_devHandle == NULL) { keep_running = 0; break; } ret = readHIDPenData(m_devHandle, penBuf, 64); if(ret == 10 && penBuf[0] == 0x1c) { TOUCH_EVENT tempEvent; tempEvent.x = penBuf[2] | (penBuf[3] << 8); tempEvent.y = penBuf[4] | (penBuf[5] << 8); tempEvent.p = penBuf[6] | (penBuf[7] << 8); // 坐标换 if(myVID == 0x206D && myPID == 0x0901) { tempEvent.x = tempEvent.x * 1920 / 37632; tempEvent.y = tempEvent.y * 1080 / 30106; tempEvent.p = tempEvent.p / 2; } vecSignInfo1.append(tempEvent); } } printf("Thread exited.\n"); return NULL; }目前怎么处理这个触摸点数据呢,才能保证低延迟性呢
03-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值