Что эквивалентно этому быстрому преобразованию Uint8 в c #? - PullRequest
2 голосов
/ 04 июня 2019

Я пытаюсь преобразовать этот быстрый фрагмент в 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.Мне просто нужно получить элемент на второй позиции и преобразовать его в подписанное целое число.

Это код на 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 дБм до +20 дБм при разрешении 1 дБм.

Спасибо тем, кто мне поможет.

1 Ответ

2 голосов
/ 04 июня 2019

Предположительно вместо:

int txPower = frameBytes[1];

(который просто расширяет беззнаковый байт до 32 бит)

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

(который повторно интерпретирует неподписанный байт как подписанный байт, , затем расширяется до 32 бит)

Обратите внимание, что (int) можно сделать неявным образом, если он более понятен:

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