#define LODWORD(x) (*((unsigned int*)&(x)))
我正在将C代码转换为python,还不太了解。如果有人能解释如何阅读本手册或它的含义,将不胜感激。
答案 0 :(得分:3)
&(x) // get address of `x` as a pointer to whatever x is
(unsigned int*)(...) // cast it to a pointer to `unsigned int`
*(...) // then read that address' contents as if it was `unsigned int`
如果确实需要,并且仅在我知道CPU体系结构的情况下,我才使用union
,否则这是非常不安全的:P
答案 1 :(得分:2)
这是一个宏,用于获取64位变量的低public class EDMTKeyboard extends InputMethodService implements KeyboardView.OnKeyboardActionListener {
private KeyboardView kv;
private Keyboard keyboard;
private boolean isCaps=false;
@Override
public View onCreateInputView() {
kv=(KeyboardView)getLayoutInflater().inflate(R.layout.keyboard,null);
keyboard=new Keyboard(this,R.xml.qwerty);
kv.setKeyboard(keyboard);
kv.setOnKeyboardActionListener(this);
Log.e("Message","Started");
return kv;
}
@Override
public void onPress(int primaryCode) {
}
@Override
public void onRelease(int primaryCode) {
}
@Override
public void onKey(int i, int[] ints) {
InputConnection ic=getCurrentInputConnection();
playClick(i);
switch (i)
{ case Keyboard.KEYCODE_DELETE:
ic.deleteSurroundingText(1,0);
break;
case Keyboard.KEYCODE_SHIFT:
isCaps=!isCaps;
keyboard.setShifted(isCaps);
kv.invalidateAllKeys();
break;
case Keyboard.KEYCODE_DONE:
ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_ENTER));
break;
default:
char code=(char) i;
if(Character.isLetter(code)&& isCaps)
code=Character.toUpperCase(code);
ic.commitText(String.valueOf(code),1);
} }
private void playClick(int i) {
AudioManager am=(AudioManager)getSystemService(AUDIO_SERVICE);
switch (i) {
case 32:
am.playSoundEffect(AudioManager.FX_KEYPRESS_SPACEBAR);
break;
case Keyboard.KEYCODE_DONE:
case 10:
am.playSoundEffect(AudioManager.FX_KEYPRESS_RETURN);
break;
case Keyboard.KEYCODE_DELETE:
am.playSoundEffect(AudioManager.FX_KEYPRESS_DELETE);
break;
default:
am.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD);
}
}
@Override
public void onText(CharSequence text) {
}
@Override
public void swipeLeft() {
}
@Override
public void swipeRight() {
}
@Override
public void swipeDown() {
}
@Override
public void swipeUp() {
}
}
(32位),最有可能的是,关联的DWORD
宏也可以获取高32位。其他评论指出了宏的一些缺陷,但这是完成此操作的相当普遍的习惯用法。
一些等效的Python代码可能是:
HIDWORD
答案 2 :(得分:0)
首先使用#define
定义一个进行替换的宏。它是带有参数的宏,即所谓的“函数式宏”。
在#define
之后,当出现表达式LODWORD(whatever you write here)
时,它将被(*((unsigned int*)&(whatever you write here)))
替换,然后将代码提供给编译器。这称为“宏扩展”。编译器将仅看到扩展表达式。
LODWORD(foo)
的宏扩展表达式执行以下操作:
(foo)
是宏中的常见用法:将参数放在括号中以避免运算符优先级错误。
&(foo)
的意思是“ (foo)
的地址”(“指针”)。这将创建一个表示foo
的存储位置的值。它的类型为“指向foo
类型的指针”。
(unsigned int*)&(foo)
将“ foo
的地址”转换为“ unsigned int
foo
的地址”。运算符(insigned int*)
被称为“强制运算符”。它将结果类型“指向foo
的指针”更改为“指向unsigned int
的指针”。
((unsigned int*)&(foo))
覆盖运算符优先级。现在,您已经“指向unsigned int
的存储位置处的foo
指针。
*((unsigned int*)&(foo))
返回unsigned int
的存储位置处的foo
的值(即使foo
不是无符号整数,即使该存储位置违反了对齐要求也是如此) unsigned int
)。
(*((unsigned int*)&(foo)))
是宏中的另一个常见用法:将整个表达式放在括号中以避免运算符优先级错误。这样,宏就可以始终像是一个函数一样使用。