2017-01-20 2 views
0

Я хочу перенести некоторые stringdata с моего Android-устройства на свой Windows-ноутбук через Bluetooth. Использование кода для bluetooth с winsock2 предоставлено Microsoft Мне удалось передать данные, используя приведенный ниже код. К сожалению, я получаю знак байтового байта в начале строки, которую я отправляю. Конечно, я мог бы просто удалить первые четыре байта, но для меня это немного грязно. Есть ли другой вариант, который я мог бы использовать?C++ - bluetooth over winsock, как удалить отметку порядка байтов

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] = '\0'; 
    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)); 

ответ

0

Хорошо, я чувствую довольно глупо сейчас. Работа в однородных java-средах в течение нескольких лет заставила меня полностью забыть, что java задает знак байтового порядка при вызове метода getBytes() с параметром unicodecharset в качестве параметра. После смены dataString.getBytes(Charsets.UTF_16) на dataString.getBytes(StandardCharsets.UTF_16LE) (окна немного endian) на стороне Android все работает так, как ожидалось.

Смежные вопросы