c++ - winsock 上的蓝牙,如何删除字节顺序标记
c++ - bluetooth over winsock, how to remove byte order mark
我想通过蓝牙将一些字符串数据从我的 Android-设备传输到我的 Windows-笔记本电脑。
使用 Microsoft 提供的带有 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] = '[=10=]';
wprintf(L"*INFO* | Received following data string from remote device:\n%s\n", (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 是小端)后,一切都按预期工作。
我想通过蓝牙将一些字符串数据从我的 Android-设备传输到我的 Windows-笔记本电脑。 使用 Microsoft 提供的带有 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] = '[=10=]';
wprintf(L"*INFO* | Received following data string from remote device:\n%s\n", (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 是小端)后,一切都按预期工作。