winsock上的蓝牙,如何删除字节顺序标记

bluetooth over winsock, how to remove byte order mark

本文关键字:删除 字节 顺序 何删除 winsock      更新时间:2023-10-16

我想通过蓝牙将一些字符串数据从我的Android设备传输到我的Windows笔记本电脑。使用微软提供的带有winsock2的蓝牙代码示例,我能够使用以下代码传输数据。不幸的是,我在发送的字符串的开头收到了一个字节顺序标记。当然,我可以简单地删除前四个字节,但这对我来说有点脏。我还有其他选择吗?

用于接收的C++代码(为了更好的可读性而稍作修改->无错误处理无注释等)

ClientSocket = accept(LocalSocket, NULL, NULL);  
BOOL bContinue = TRUE; 
pszDataBuffer = (char *)HeapAlloc(GetProcessHeap(), 
HEAP_ZERO_MEMORY, 
CXN_TRANSFER_DATA_LENGTH); 
pszDataBufferIndex = pszDataBuffer; 
uiTotalLengthReceived = 0; 
while ( bContinue && (uiTotalLengthReceived < CXN_TRANSFER_DATA_LENGTH) ) { 
iLengthReceived = recv(ClientSocket, 
(char *)pszDataBufferIndex, 
(CXN_TRANSFER_DATA_LENGTH - uiTotalLengthReceived), 
0); 
switch ( iLengthReceived ) { 
case 0: // socket connection has been closed gracefully 
bContinue = FALSE; 
break; 
case SOCKET_ERROR: 
wprintf(L"=CRITICAL= | recv() call failed. WSAGetLastError=[%d]n", WSAGetLastError()); 
bContinue = FALSE; 
ulRetCode = CXN_ERROR; 
break; 
default:  
pszDataBufferIndex += iLengthReceived; 
uiTotalLengthReceived += iLengthReceived; 
break; 
} 
} 
if ( CXN_SUCCESS == ulRetCode ) { 
pszDataBuffer[uiTotalLengthReceived] = '';
wprintf(L"*INFO* | Received following data string from remote device:n%sn", (wchar_t *)pszDataBuffer); 
closesocket(ClientSocket);
ClientSocket = INVALID_SOCKET;                  
} 

发送的Android代码:

OutputStream socketOutpuStream = socket.getOutputStream();
socketOutputStream.write(dataString.getBytes(Charsets.UTF_16));

好吧,我现在觉得很愚蠢。在同质java环境中工作了几年,这让我完全忘记了java在使用unicodecharset作为参数调用getBytes()时会设置字节顺序标记。在android端将dataString.getBytes(Charsets.UTF_16)更改为dataString.getBytes(StandardCharsets.UTF_16LE)(windows是little-endian)后,一切都如预期那样工作。