我正在尝试在C#中转换此快速代码段,但我有些困惑。基本上,我需要此功能从信标获取测距数据,如此处所示:https://github.com/google/eddystone/tree/master/eddystone-uid
func getTxPower( frameData: NSData) -> Int
{
let count = frameData.length
var frameBytes = [UInt8](repeating: 0, count: count)
frameData.getBytes(&frameBytes, length: count)
let txPower = Int(Int8(bitPattern:frameBytes[1]))
return txPower
}
我得到一个NSData并将其转换为UInt8数组。我只需要将该元素放在第二位并将其转换为带符号的int。
这是我尝试过的C#代码:
int getTxPower(NSData frameData)
{
var count = frameData.Length;
byte[] frameBytes = new byte[Convert.ToInt32(count)];
Marshal.Copy(frameData.Bytes, frameBytes,0,Convert.ToInt32(count));
int txPower = frameBytes[1];
return txPower;
}
我也希望得到负值,因为如链接中所述,TxPower的值范围为-100 dBm至+20 dBm,分辨率为1 dBm。
感谢那些会帮助我的人。
答案 0 :(得分:2)
大概代替:
int txPower = frameBytes[1];
(仅将无符号字节扩展为32位)
int txPower = (int)((sbyte)frameBytes[1]);
(将无符号字节重新插入为有符号字节,然后然后扩展为32位)
请注意,(int)
可以隐式完成,如果更清楚:
int txPower = (sbyte)frameBytes[1];