Почему powershell отправляет 195 и 191 вместо 255?
Занимаюсь разработкой проекта, но возникла проблема.
Пытаюсь отправить с клиента (Powershell) Яна сервер (Python) картинку в байтовом представлении, отправляю пиксели в формате RGB. К примеру вот что отправляет клиент если отправить чёерную картинку 2х1:
[0, 0, 0, 0, 0, 0]
Думаю смысл понятен.
Но при отправке числа 255 клиента отправлеяет [195, 191], при отправке 130 клиент отправляет [194, 130], но при отправке 123 и ниже отправляет само число(т.е. [123]).
Немного почитав, нашёл что это байты utf-8 и попробовал такой код для расшифровки:
def clean_packet(packet):
answer = []
decoded_packet = packet.decode('utf-8')
for byte in decoded_packet:
print(byte, len(decoded_packet))
answer.append(ord(byte))
return answer
Однако, код возращал на кучу байт меньше оригинала. Есть ли какие догадки как же можно конвертировать байты? Или же уже были похожие вопросы? Буду благодарен за помощь.
Вот код powershell для отправки пикселей:
Add-Type -AssemblyName System.Windows.Forms;
$imagePath="$env:temp\microsoft-log-desktop\test.png";
$bitmap = New-Object System.Drawing.Bitmap($imagePath);
$bytes = @();
for ($x = 0; $x -lt $bitmap.Width; $x++) {
for ($y = 0; $y -lt $bitmap.Height; $y++) {
$pixel = $bitmap.GetPixel($x, $y);
$red = $pixel.R;
$green = $pixel.G;
$blue = $pixel.B;
$bytes += $red;
$bytes += $green;
$bytes += $blue;
}
}
Write($bytes.Length);
$packet = [byte[]]@(5) + $bytes;
$messageToSend = PackPacket($packet);
$writer.WriteLine($messageToSend, 0, $messageToSend.Length);
$writer.Flush();
Ответы (1 шт):
Оказалось и вправду когда я использую $writer.WriteLine() он пишет символы. Я просто заменил на $socket. Вот исправленный код:
powershell
$server_port = 1336;
$server_ip = '127.0.0.1';
$socket = New-Object System.Net.Sockets.Socket(
[System.Net.Sockets.AddressFamily]::InterNetwork,
[System.Net.Sockets.SocketType]::Stream,
[System.Net.Sockets.ProtocolType]::Tcp
);
Add-Type -AssemblyName System.Windows.Forms;
$imagePath="$env:temp\microsoft-log-desktop\test.png";
$bitmap = New-Object System.Drawing.Bitmap($imagePath);
$bytes = @();
for ($x = 0; $x -lt $bitmap.Width; $x++) {
for ($y = 0; $y -lt $bitmap.Height; $y++) {
$pixel = $bitmap.GetPixel($x, $y);
$red = $pixel.R;
$green = $pixel.G;
$blue = $pixel.B;
$bytes += $red;
$bytes += $green;
$bytes += $blue;
}
}
Write($bytes.Length);
$packet = [byte[]]@(5) + $bytes;
$messageToSend = PackPacket($packet);
$socket.Send($messageToSend);
всем спасибо за ответы!