Порядок байтов с большим массивом символов в C

Переменная name, но вы использовали person, поэтому она находит элемент с идентификатором person, поскольку они не являются переменными person.

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8" />
  <title>Challenge: Mad Libs</title>
 </head>
 <body>
 
    <h1>Mad Libs</h1>
     
    <ul>
      <li>Noun: <input type="text" id="noun"></li>
      <li>Adjective: <input type="text" id="adjective"></li>
      <li>Someone's Name: <input type="text" id="person"></li>
    </ul>
     
    <button id="lib-button">Lib it!</button>
      
    <p>Generated story: 
    <span id="story"></span>
    </p>
 
    <script>
        var libButton = document.getElementById('lib-button');
        var libIt = function() {
            var storyDiv = document.getElementById("story");
            var noun = document.getElementById("noun").value;
            var adjective = document.getElementById("adjective").value;
            var name = document.getElementById("person").value;
            storyDiv.innerHTML = "I took my " + noun + " and " + 
              adjective + " it. "+ name + " didn't like it.";
        };
        libButton.addEventListener('click', libIt);
        
    </script>
  
 </body>
</html>

8
задан Tall Jeff 8 February 2009 в 19:12
поделиться

5 ответов

Хорошо, кажется, существуют проблемы с тем, что Вы делаете на двух разных уровнях. Часть беспорядка здесь, кажется, происходит для Вашего использования указателей, на какие объекты они указывают на, и затем интерпретация кодирования значений в памяти, на которую указывает указатель (указатели).

Кодирование многобайтовых объектов в памяти - то, что упоминается как порядок байтов. Две общих кодировки упоминаются как и Обратный порядок байтов (BE) С прямым порядком байтов (LE). С LE 16-разрядное количество как короткое является закодированным младшим значащим байтом (LSB) сначала. Под БЫТЬ, старший значащий байт (MSB) кодируется сначала.

Условно, сетевые протоколы обычно кодируют вещи в то, что мы называем "сетевым порядком байтов" (NBO), который также, оказывается, совпадает с БЫТЬ. Если Вы отправите и получите буферы памяти на платформах с обратным порядком байтов, то Вы не столкнетесь с проблемами преобразования. Однако Ваш код затем был бы платформой, зависящей от БЫТЬ конвенцией. Если Вы хотите написать портативный код, который работает правильно и над LE и ЯВЛЯЕТСЯ платформами, Вы не должны принимать порядок байтов платформы.

Достижение мобильности порядка байтов является целью стандартных программ как ntohs (), ntohl (), htons (), и htonl (). Эти функции/макросы определяются на данной платформе, чтобы сделать необходимые преобразования в передающих и принимающих концах:

  • htons () - Преобразовывают короткое значение от порядка хоста до сетевого порядка (для отправки)
  • htonl () - Преобразовывают длинное значение от порядка хоста до сетевого порядка (для отправки)
  • ntohs () - Преобразовывают короткое значение из сетевого порядка разместить порядок (после того, как получите),
  • ntohl () - Преобразовывают длинное значение из сетевого порядка разместить порядок (после того, как получите),

Поймите, что Ваш комментарий о доступе к памяти при бросании к символам не имеет никакого влияния на фактическом порядке объектов в памяти. Таким образом, при доступе к буферу как к ряду байтов Вы будете видеть байты в любом порядке, они были на самом деле закодированы в память как, имеете ли Вы БЫТЬ или машина LE. Таким образом, при рассмотрении NBO, закодированный буфер после получает, MSB будет первым - всегда. Если Вы смотрите на буфер вывода после того, как Ваш преобразовали назад для хостинга порядка, если Вы имеете, машина, порядок байтов будет неизменен. С другой стороны, на машине LE, байты будут все теперь инвертированы в преобразованном буфере.

Наконец, в Вашем цикле преобразования, переменной total относится к байтам. Однако Вы получаете доступ к буферу как shorts. Ваша защита цикла не должна быть total, но должен быть:

total / sizeof( unsigned short )

составлять двухбайтовую природу каждого short.

10
ответ дан 5 December 2019 в 10:44
поделиться

Это работает хорошо, когда я рассматриваю данные как короткое, однако если я бросил указатель на символ снова, байты инвертируются.

Это - то, что я ожидал бы.

Что я делаю неправильно?

Необходимо знать что отправленный отправитель: знайте, являются ли данные байтами (которым не нужно инвертирование), или короткие замыкания, или longs (которые делают).

Google для учебных руководств, связанных с ntohs, htons, и htons API.

3
ответ дан 5 December 2019 в 10:44
поделиться

Это не ясно что aResponse представляет (строка символов? структура?). Порядок байтов важен только для численных значений, нет chars. Также необходимо удостовериться, что в стороне отправителя, все численные значения преобразовываются от хоста до сетевого порядка байтов (hton*).

2
ответ дан 5 December 2019 в 10:44
поделиться

Кроме Вашего исходного вопроса (тому, которое я думаю, уже ответили), необходимо взглянуть на malloc оператор. malloc выделяет байты, и короткое целое без знака, скорее всего, составит два байта.

Ваш оператор должен быть похожим:

unsigned short *ptr = (unsigned short*) malloc(total * sizeof(unsigned short));
1
ответ дан 5 December 2019 в 10:44
поделиться

сетевой порядок байтов является обратным порядком байтов, таким образом, необходимо преобразовать его в прямой порядок байтов, если Вы хотите, чтобы он имел смысл, но если это - только массив, он не должен поднимать шум, как делает отправителя, отправляет, это - данные?

0
ответ дан 5 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: