C指针算术表达式求值疑问及等效Java实现咨询
原C代码逻辑确认
你对那行C代码的等效拆解完全正确,其执行逻辑可以明确为:
- 将
contents指针强制转换为无符号整数类型,得到其指向内存的起始地址数值 - 地址数值直接加2,此处为字节偏移2,不是按
uint步长计算的指针偏移 - 计算后的地址强制转换为
ushort*类型(16位无符号整数指针) - 将
uVar1的低16位写入该指针指向的2字节内存空间,超出16位的高位数据直接丢弃
Java等效实现说明
Java无直接指针操作,且你指定用long[]替代原contents数组,实现前需要先确认原C代码运行平台的字节序(x86平台默认小端序,嵌入式/网络场景多为大端序),两类场景实现略有差异:
前置说明
原contents为96字节数组,Java中long占8字节,因此替换用的long[]长度应为96 / 8 = 12,我们的目标是向数组起始位置偏移2字节的位置写入uVar1的低16位。
小端序实现(多数桌面端C程序为此场景)
// contents为替换用的long[]数组,uVar1为原逻辑得到的int变量 int byteOffset = 2; int arrIndex = byteOffset / 8; // 计算偏移落在long数组的第几个元素,此处为0 int bitShift = (byteOffset % 8) * 8; // 计算在long元素内的位偏移,此处为16 // 先清空目标位置的16位,再写入uVar1的低16位 contents[arrIndex] = (contents[arrIndex] & ~(0xFFFFL << bitShift)) | ((long) (uVar1 & 0xFFFF) << bitShift);
大端序实现
如果原C代码运行在大端序平台,需要先交换16位数据的高低字节再写入:
int byteOffset = 2; int arrIndex = byteOffset / 8; int bitShift = (byteOffset % 8) * 8; int low16 = uVar1 & 0xFFFF; // 交换高低字节适配大端序 int swappedLow16 = ((low16 & 0xFF) << 8) | ((low16 >> 8) & 0xFF); contents[arrIndex] = (contents[arrIndex] & ~(0xFFFFL << bitShift)) | ((long) swappedLow16 << bitShift);
注意事项
- 若原C代码中
uVar1的值超过ushort的最大值(0xFFFF),写入时只会保留低16位,上述Java实现中的uVar1 & 0xFFFF已经对齐该行为 - 字节序必须和原C代码运行平台保持一致,否则写入的数据会出错
内容的提问来源于stack exchange,提问作者elsamuray7
相关产品推荐
相关产品推荐

