惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
M
MIT News - Artificial intelligence
博客园 - Franky
J
Java Code Geeks
V
Visual Studio Blog
G
Google Developers Blog
罗磊的独立博客
MongoDB | Blog
MongoDB | Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Recent Announcements
Recent Announcements
Last Week in AI
Last Week in AI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog
博客园 - 司徒正美
The GitHub Blog
The GitHub Blog
腾讯CDC
阮一峰的网络日志
阮一峰的网络日志
V
V2EX
博客园 - 【当耐特】
IT之家
IT之家
I
InfoQ
U
Unit 42
C
Check Point Blog
Martin Fowler
Martin Fowler

博客园 - 夕西行

miniconda安装(windows)到D盘(环境也在D盘) 显卡、cuda、pytorch版本确定与安装 conda的安装与使用 conda虚拟环境中的pip、No module named问题、missing the 'build_editable' hook和PEP660 mmyolo与官方yolo,在背景数据集上的注意事项 跨平台的文件夹映射cifs WinSCP复制时报 Received SSH2_MSG_CHANNEL_DATA for nonexistent channel 0 CMakeLists.txt之include、lib labelImg安装、改软件后打包成exe、改软件功能 Jetson插网线后启动慢 mmyolo数据集、训练 mmyolo安装 QString有中文空格时 VS2015下载 Qt5.15.2在线安装 向串口发送数据的方式 编译Arm Qt5.14.2(在Arm上本地编译) Qt5.14.2下载 VS2022编译运行VS2015的项目 QString的toStdString().c_str()坑
二进制字面量、字节序、串口发送、转16进制时符号扩展问题
夕西行 · 2025-03-17 · via 博客园 - 夕西行
int data = 0b11111111'00000000'00000000'00000001;
//int data=-16777215  //等效
char cBuff[4];
*(short*)cBuff = 1;
cBuff[2] = 0; 
cBuff[3] = 255;

二进制字面量data与cBuff等效,注意:二进制字面量的右侧是低字节

在大多数系统中,整数是以小端序(Little Endian)存储的。因此,-16777215 的字节序为:

 用命令行向串口发送数据,是以字节序发送的(低到高依次发送,16进制格式),所以发送data应该

printf '\x01\x00\x00\xFF' > /dev/ttyTHS1
或
echo -ne '\x01\x00\x00\xFF' > /dev/ttyTHS1

而不是

printf '-16777215' > /dev/ttyTHS1

 【转16进制时符号扩展问题】

cBuff是char类型,255其实是-1,-1 会被符号扩展为 int 类型的 -1(二进制表示为 0xFFFFFFFF),而不是认为的0xFF

//发送给串口(需转2位16进制)
char command[64];
sprintf(command, "printf '\\x%02X\\x%02X\\x%02X\\x%02X' > /dev/ttyTHS1",(unsigned char)cBuff[0], (unsigned char)cBuff[1],(unsigned char)cBuff[2], 
cBuff[3]); sendSSH(m_session, command);

注意 cBuff[3] 没有加 (unsigned char),那么发送给串口会出现异常(我的灯不确定的亮起)

所以,通过代码转16进制时,一定要留意溢出导致的符号扩展问题。推荐严谨的代码风格,0~255就用uchar(即 uchar cBuff[4],之后的就不再用unsigned char转了)

 ARM中,下述不会出错的原因是指定写入4字节数据,cBuff[3]是第4个字节,其8位是 11111111。而 %02X 会将其格式化为 FFFFFFFF,而不是期望的 FF。

ssize_t bytesWritten = write(fd, cBuff, 4);//写入4字节数据