我需要一些帮助将此C#代码移植到C。我可以在C#中正常工作,但在C中得到错误的返回。我应该将移位分隔成几行吗?我以为数据类型存在问题,但我认为数据类型正确。这是返回0x03046ABE的工作代码
UInt32 goHigh(UInt32 x) { return (UInt32)(x & 0xFFFF0000); }
UInt32 goLow(UInt32 x) { return (UInt32)(x & 0xFFFF); }
UInt32 magic(UInt32 pass){
UInt32 key = pass;
UInt16 num = 0x0563;
key = (goLow(key) << 16) | (UInt16)(((num >> 3) | (num << 13)) ^ (goHigh(key) >> 16));
return key; //returns 0x03046ABE
}
magic(0x01020304);
这是我试图开始工作的不正确的C代码
unsigned long goHigh(unsigned long x) {
return (unsigned long )(x & 0xFFFF0000); }
unsigned long goLow(unsigned long x) {
return (unsigned long )(x & 0xFFFF); }
unsigned long magic(unsigned long pass){
unsigned long key = pass;
unsigned int num = 0x0563;
key = (goLow(key) << 16) | (unsigned int)(((num >> 3) | (num << 13)) ^ (goHigh(key) >> 16));
return key;
}
magic(0x01020304); //returns 0xb8c6a8e
答案 0 :(得分:5)
最可能的问题在这里:
select stuff (
(select ',' + value
from STRING_SPLIT ('000001U;000002;000003U;000004;000005U;000006U', ';')
where right(value, 1) <> 'U'
for xml path('')),
1, 1, '')
您期望的是16位。在不同的机器上可能更大。与unsigned long相同,如您所料,它可能是64位而不是32位。
请确保使用key = (goLow(key) << 16) | (unsigned int)(((num >> 3) | (num << 13)) ^ (goHigh(key) >> 16));
^^^^^^^^^^^^
和uint32_t
。您必须uint16_t
才能使用它们。
答案 1 :(得分:3)
long和int不是您在平台上期望的大小(分别为32位和16位)
将基本类型替换为实际大小,并且将得到相同的输出。我还删除了多余的演员表。
这些类型可以在stdint.h中找到
export default {
data: function() {
return {
id: this.$route.params.id,
e: {},
users: []
}
},
methods: {
issueTicket: function(id, user) {
}
},
created(){
this.$http.get('http://localhost:1337/api/v1/event/find', { params : { id : this.id } }).then(result => {
this.e = result.body.result[0];
})
}
}