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

推荐订阅源

Security Latest
Security Latest
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Stack Overflow Blog
Stack Overflow Blog
WordPress大学
WordPress大学
N
Netflix TechBlog - Medium
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
C
Cyber Attacks, Cyber Crime and Cyber Security
雷峰网
雷峰网
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Threat Research - Cisco Blogs
NISL@THU
NISL@THU
Spread Privacy
Spread Privacy
P
Proofpoint News Feed
J
Java Code Geeks
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MyScale Blog
MyScale Blog
T
Tor Project blog
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
P
Privacy & Cybersecurity Law Blog
MongoDB | Blog
MongoDB | Blog
Simon Willison's Weblog
Simon Willison's Weblog
C
Cybersecurity and Infrastructure Security Agency CISA
L
LINUX DO - 热门话题
小众软件
小众软件
G
GRAHAM CLULEY
P
Privacy International News Feed
AWS News Blog
AWS News Blog
Know Your Adversary
Know Your Adversary
P
Palo Alto Networks Blog
人人都是产品经理
人人都是产品经理
S
Schneier on Security
Scott Helme
Scott Helme
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog RSS Feed
T
The Exploit Database - CXSecurity.com
Recent Announcements
Recent Announcements
E
Exploit-DB.com RSS Feed
C
CXSECURITY Database RSS Feed - CXSecurity.com
U
Unit 42
The Register - Security
The Register - Security
S
Securelist
Martin Fowler
Martin Fowler
Project Zero
Project Zero
大猫的无限游戏
大猫的无限游戏
Cisco Talos Blog
Cisco Talos Blog

博客园 - 夕西行

显卡、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字节数据