在C#中这种快速的Uint8转换等效于什么?

时间:2019-06-04 12:23:30

标签: c# swift xamarin.ios byte beacon

我正在尝试在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。

感谢那些会帮助我的人。

1 个答案:

答案 0 :(得分:2)

大概代替:

int txPower = frameBytes[1];

(仅将无符号字节扩展为32位)

int txPower = (int)((sbyte)frameBytes[1]);

(将无符号字节重新插入为有符号字节,然后然后扩展为32位)

请注意,(int)可以隐式完成,如果更清楚:

int txPower = (sbyte)frameBytes[1];