Здесь HexToBin и BinToHex относительно чисты и читаемы. (Примечание. Первоначально были возвращены коды ошибок enum через систему регистрации ошибок, а не простой -1 или -2.)
typedef unsigned char ByteData;
ByteData HexChar (char c)
{
if ('0' <= c && c <= '9') return (ByteData)(c - '0');
if ('A' <= c && c <= 'F') return (ByteData)(c - 'A' + 10);
if ('a' <= c && c <= 'f') return (ByteData)(c - 'a' + 10);
return (ByteData)(-1);
}
ssize_t HexToBin (const char* s, ByteData * buff, ssize_t length)
{
ssize_t result = 0;
if (!s || !buff || length <= 0) return -2;
while (*s)
{
ByteData nib1 = HexChar(*s++);
if ((signed)nib1 < 0) return -3;
ByteData nib2 = HexChar(*s++);
if ((signed)nib2 < 0) return -4;
ByteData bin = (nib1 << 4) + nib2;
if (length-- <= 0) return -5;
*buff++ = bin;
++result;
}
return result;
}
void BinToHex (const ByteData * buff, ssize_t length, char * output, ssize_t outLength)
{
char binHex[] = "0123456789ABCDEF";
if (!output || outLength < 4) return (void)(-6);
*output = '\0';
if (!buff || length <= 0 || outLength <= 2 * length)
{
memcpy(output, "ERR", 4);
return (void)(-7);
}
for (; length > 0; --length, outLength -= 2)
{
ByteData byte = *buff++;
*output++ = binHex[(byte >> 4) & 0x0F];
*output++ = binHex[byte & 0x0F];
}
if (outLength-- <= 0) return (void)(-8);
*output++ = '\0';
}
rdesktop и tsclient и работают хорошо, по моему опыту, над Red Hat и Ubuntu. Я ожидаю, что или или оба были бы доступны для SuSe. Я использую немного сценария оболочки для доступа к окнам по RDP:
#!/bin/sh
SERVER=name.of.windows.machine
/usr/bin/rdesktop -g 1152x864 \
-a 16 \
-u windowsusername \
-d windowsdomain \
-r sound:local \
$SERVER
Вы могли использовать VNC. Сервер VNC может быть установлен на Вашем поле Windows и клиенте VNC, установленном на Вашем ноутбуке Linux. VNC свободен и очень хорош, я склонен использовать его в предпочтении к Удаленному рабочему столу.