📄 obexparser.cs
字号:
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
namespace bluetoothX
{
internal static class ObexParser
{
internal static void ParseHeaders(byte[] packet, ref short remoteMaxPacket, Stream bodyStream, WebHeaderCollection headers)
{
ObexMethod method = (ObexMethod)packet[0];
int packetLength = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(packet, 1));
int pos = 3;
while (pos < packetLength)
{
ObexHeader header = (ObexHeader)packet[pos];
int intValue = 0;
switch (header)
{
case ObexHeader.None:
return;
case (ObexHeader)0x10:
remoteMaxPacket = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(packet, pos + 2));
pos += 4;
break;
case ObexHeader.ConnectionID:
case ObexHeader.Count:
case ObexHeader.CreatorID:
case ObexHeader.Time4Byte:
intValue = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(packet, pos + 1));
headers.Add(header.ToString().ToUpper(), intValue.ToString());
pos += 5;
break;
case ObexHeader.Length:
intValue = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(packet, pos + 1));
bluetoothX.ServerTotalLen = intValue;
headers.Add(header.ToString().ToUpper(), intValue.ToString());
pos += 5;
break;
case ObexHeader.Who:
short whoSize = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(packet, pos + 1));
byte[] whoBytes = new byte[16];
Buffer.BlockCopy(packet, pos + 3, whoBytes, 0, whoSize - 3);
Guid service = new Guid(whoBytes);
headers.Add(header.ToString().ToUpper(), service.ToString());
pos += whoSize;
break;
case ObexHeader.Body:
case ObexHeader.EndOfBody:
short bodySize = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(packet, pos + 1));
bodyStream.Write(packet, pos + 3, bodySize - 3);
bluetoothX.ServerCurrentGetted += (bodySize - 3);
pos += bodySize;
bluetoothX.bServerStatus = true;
break;
case ObexHeader.Name:
int nameLen = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(packet, pos + 1));
if (nameLen > 3)
{
string headerString = System.Text.Encoding.BigEndianUnicode.GetString(packet, pos + 3, nameLen - 4);
if (headerString != null)
{
int nullindex = headerString.IndexOf('\0');
if (nullindex > -1)
{
headerString = headerString.Substring(0, nullindex);
}
if (headerString != string.Empty)
{
headers.Add(header.ToString().ToUpper(), headerString);
}
bluetoothX.ReceiveFileName = headerString;
}
}
pos += nameLen;
break;
default:
int headerSize = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(packet, pos + 1));
if (headerSize > 3)
{
string headerString = System.Text.Encoding.BigEndianUnicode.GetString(packet, pos + 3, headerSize - 4);
if (headerString != null)
{
int nullindex = headerString.IndexOf('\0');
if (nullindex > -1)
{
headerString = headerString.Substring(0, nullindex);
}
if (headerString != string.Empty)
{
headers.Add(header.ToString().ToUpper(), headerString);
}
}
}
pos += headerSize;
break;
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -