You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 04:54:04