Другой способ ответить на это, вместо того, чтобы увязнуть в тайных деталях точек последовательности и неопределенного поведения, - это просто спросить, , что они должны означать? Что было программистом пытаясь сделать?
Первый фрагмент, о котором спросили, i = i++ + ++i
, в моей книге довольно сумасшедший. Никто никогда не напишет его в реальной программе, не очевидно, что он делает, нет никакого мыслимого алгоритма, который кто-то мог бы попытаться закодировать, что привело бы к этой конкретной надуманной последовательности операций. И поскольку для вас и меня не очевидно, что он должен делать, это прекрасно в моей книге, если компилятор не может понять, что он должен делать.
Второй фрагмент i = i++
, немного легче понять. Кто-то явно пытается увеличить i и присвоить результат i. Но есть несколько способов сделать это в C. Самый простой способ добавить 1 к i и присвоить результат обратно i, тот же почти для любого языка программирования:
i = i + 1
C , конечно, имеет удобный ярлык:
i++
Это означает, что «добавьте 1 к i и присвойте результат обратно i». Итак, если мы построим мешанину из двух, написав
i = i++
, то, что мы действительно говорим, это «добавить 1 к i» и присвоить результат обратно i, и присвоить результат обратно i ». Мы сбиты с толку, поэтому меня это слишком беспокоит, если компилятор тоже запутался.
Реально, единственный раз, когда эти сумасшедшие выражения получаются написанными, когда люди используют их как искусственные примеры того, как ++ должен работать. И, конечно же, важно понимать, как работает ++. Но одно практическое правило для использования ++: «Если не очевидно, что означает выражение, использующее ++, не пишите».
Мы проводили бесчисленные часы на comp.lang.c, обсуждая выражения, подобные этим, и , почему они не определены. Два моих более длинных ответа, которые пытаются объяснить, почему, заархивированы в Интернете:
Это действительно помогает понять, что вы делаете в коде, поэтому я попросил показать его. Я угадал , ваш код выглядит так:
var f = $("image").files[0];
var reader = new FileReader();
reader.readAsBinaryString(f);
var image = reader.result;
$.ajax({
url: theUrl,
type: 'POST',
data: { Image: image }
});
Теперь, когда вы говорите:
Я получаю вывод следующим образом:
GIF89a,úæÿÿÿ2c½3...
Is мой вывод [...] двоичные данные?
blockquote>Ну да, но вы можете прочитать его, так что это текст , Разница между двоичными и текстовыми данными немного запутанна, прочитайте этот , если вы хотите больше запутаться. Причиной вашей проблемы является кодирование, как объясняется в этой статье.
Это зависит от того, как вы выводите его на свою страницу, но браузер может или не может применять определенную кодировку к полученным данным (инспекция Fiddler может научить вас больше то, что отправляется по HTTP-проводу) и отображать его как более или менее читаемый текст.
Это не относится к вашей переменной
image
, хотя, которая содержит фактические двоичные данные изreadAsBinaryString()
приводит в виде «исходные двоичные данные [sic]» . О, небрежно напечатанный, кто заботится о том, что вы возвращаетесь. Надеюсь / надеюсь массив байтов. Теперь вам нужно отправить это на сервер. Предпочтительно загрузки файлов обрабатываются элементами<input type="file" />
, но иногда вам нужно делать что-то с помощью AJAX. Вы не можете действительно загружать реальные файлы через JavaScript, хотя, насколько я знаю, поддержка браузера кажется возрастающей.Таким образом, вам нужно будет
POST
с содержимым файла в качестве одного из параметров размещенной формы. Чтобы это произошло успешно с двоичными данными, вам необходимо правильно закодировать его для отправки формы.Сначала убедитесь, что запрос сделан с
content-type
вapplication/x-www-form-urlencoded
. Вы можете проверить это в Fiddler или посоветоваться с руководством . Последний вообще не упоминает какую-либо кодировку, вы должны понять, что вне .Теперь вам нужно url-encode бинарные данные, чтобы опубликовать его. Эта функция возвращает входные байты, интерпретируемые как UTF-8, в виде строки с кодировкой URL, которая может быть безопасно размещена. Затем serveride, вы можете заменить
System.Text.Encoding.GetEncoding («ISO-8859-1»). GetBytes (_Context.Request [«Изображение»]);
< / blockquote>С
System.Text.Encoding.UTF8 .GetBytes (_Context.Request ["Изображение"]);
blockquote>Но почему у вас есть содержимое файла в этой форме? Как , этот ответ упоминает, что
FileReader
также содержит методreadAsDataURL
, который позволяет вам использоватьreader.result
непосредственно как переменнуюPOST
.Итак, ваш код будет выглядеть следующим образом:
var f = $("image").files[0]; var reader = new FileReader(); reader.readAsDataURL(f); var image = reader.result; $.ajax({ url: theUrl, type: 'POST', data: { Image: image } });
Затем, на сервере, вам придется декодировать данные с базы 64:
byte[] imageBytes = System.Convert.FromBase64String(_Context.Request["Image"]);
Как это работает?