narayan_kumar Ответов: 3

Как объединить два символьных буфера в C


Я пытаюсь объединить два символьных буфера в C, но в конце теряю байты. Мой текущий код выглядит следующим образом:

Мой вывод выглядит следующим образом:

первый блок захвачен как [4ohizB}/ 6,7:}0,H@FbACm.bL~%=a>x!<v|qrv6pfhgsrvmzv}z;z+nfy47toxdoe;c@% ejpcb="ukbwE9d+nBs.+a4qt^cSWK!D+N@=<Hkv7tLPX1L]|1!HawzKEc-$gQeq4tp6bz<]JSbF_j9/-43e9eRRH+Zk3cpLr4|ZD^^L.&JT$l4nD6">rmlzG%l_H6)qWq[S**puDt2l CmRkr7F^B:!Z5oEXy_{~vV-7N8E-6SA&rCT 1(DbeQhTzJw,8Cp,]@N_T,%}LH7[rDg#)xhc@^ekYI-zsq|m4HFvbq0wJZ8^z{w+B|{bSh3~ugc%:QFt4VP0bV8O8dyQ=EB1=6MvJ;_Hbqr;IJ&7[oMhYS;xYpF>Vh%74&.lOr^!##I@Mg/:AtfJ@VW0Mgo}YLSfBJk+4p6<rw2rgy!x{juin!vkzf8&>CUzGQp;vaFPu[~fos@>@hDJ5-^meWpu/8fVpctX{3Nqn[, |c]T3rN-)kpJkYG.gze[C@|kQRL]

второй блок захвачен как [bOv>AHp=|<_;c]73Dud+(1o#FJr~ZB1;2NgI;]}oAcIoqK(;8Pd,0.r6CUQ7xp~+nEELqkZ|9-$vkZ%~k#2N&2LWnA~GZdH][$-:3vytS88Opd8==JG&Db29IqEB8EOpyPJIt?L-e1Vk1|A=kN)+jLAytyekc$ C[|-rP$F8gr}4.&enyg0{@lkG8&~FY|16c(FT)52j|teYT3-og4G?N{JX?tP6|@|oZlGD9LvAH=kA=9d8>vS?9/yzy(tLZYf]9>QA/E|^k,Q#iYE_SIY7&vz^(-h_phap.$Lad1j[fi2<qqr$a[0hb9f&li&5xtm$l-s$9?fsdn$uqea~!gs>a/3@4#bCP5zU]1Hlr.GT9].)|]9[ht2U{NJ1y0,FTteR*Кувмфмх ?YwEgOOP073oE)TCRq;>d;#gJ:ju)eoz-ZB[TFHN8;&/B|CAIkTsj4twx:A?S,OIeMt6R$ZE*z7STP8X{6-[@{!6P=&En+|t5Ww ^Zfq~b&tlk_N]]

combined block with the second block added [4ohizB}/ 6,7:}0,H@FbACm.bL~%=a>x!<v|qrv6pfhgsrvmzv}z;z+nfy47toxdoe;c@% ejpcb="ukbwE9d+nBs.+a4qt^cSWK!D+N@=<Hkv7tLPX1L]|1!HawzKEc-$gQeq4tp6bz<]JSbF_j9/-43e9eRRH+Zk3cpLr4|ZD^^L.&JT$l4nD6">rmlzG%l_H6)qWq[S**puDt2l CmRkr7F^B:!Z5oEXy_{~vV-7N8E-6SA&rCT 1(DbeQhTzJw,8Cp,]@N_T,%}LH7[rDg#)xhc@^ekYI-zsq|m4HFvbq0wJZ8^z{w+B|{bSh3~ugc%:QFt4VP0bV8O8dyQ=EB1=6MvJ;_Hbqr;IJ&7[oMhYS;xYpF>Vh%74&.lOr^!##I@Mg/:AtfJ@VW0Mgo}YLSfBJk+4p6<rw2rgy!x{juin!vkzf8&>CUzGQp;vaFPu[~fos@>@hDJ5-^meWpu/8fVpctX{3Nqn[, |c]T3rN-)kpJkYG.gze[C@|kQRLbOv>AHp=|<_;c]73Dud+(1o#FJr~ZB1;2NgI;]}oAcIoqK(;8Pd,0.r6CUQ7xp~+nEELqkZ|9-$vkZ%~k#2N&2LWnA~GZdH][$-:3vytS88Opd8==JG&Db29IqEB8EOpyPJIt?L-e1Vk1|A=kN)+jLAytyekc$ C[|-rP$F8gr}4.&enyg0{@lkG8&~FY|16c(FT)52j|teYT3-og4G?N{JX?tP6|@|oZlGD9LvAH=kA=9d8>vS?9/yzy(tLZYf]9>QA/E|^k,Q#iYE_SIY7&vz^(-h_phap.$Lad1j[fi2<qqr$a[0hb9f&li&5xtm$l-s$9?fsdn$uqea~!gs>a/3@4#bCP5zU]1Hlr.GT9].)|]9[ht2U{NJ1y0,FTteR*QuWmfMH ?YwEgOOP073oE)TCRq;>d;#gJ:ju)eoz-ZB[TFHN8;&/B|CAIkTsj4<twx:a?s,oiemt6r

как вы="" можете="" видеть="" в="" сочетании="" блок="" является="" отсутствует="" объем="" символов="" $Зе*z7stp8x{6-[@{!6=""&ГТ;П=&ампер;Ан - +|t5Ww ^Ботанической сад~б&амп;tlk_N что последние 53 байт второго блока.

Пожалуйста, просмотрите и подтвердите, что я мог бы сделать неправильно, объединив два блока и показав содержимое объединенного блока.

Что я уже пробовал:

//firstblock and secondblock are captured at different times from the passed in character buffer variable named buf
firstblock = (char*) malloc(512*sizeof(char));
memcpy(firstblock, buf, 512);
secondblock = (char*) malloc(512*sizeof(char));
memcpy(secondblock,  buf, 512);

//minimum code to test combining:
logMessage(LOG_INFO_LEVEL, "first block captured as [%s]", firstblock);
logMessage(LOG_INFO_LEVEL, "second block captured as [%s]", secondblock);
char *combinedblock;
combinedblock = (char*)malloc(sizeof(char)*(1024));
memcpy(combinedblock, firstblock, 512);
//logMessage(LOG_INFO_LEVEL, "combined block with just the first part [%s]", combinedblock);
memcpy(combinedblock+512, secondblock, 512);
logMessage(LOG_INFO_LEVEL, "combined block with the second block added [%s]", combinedblock);

Richard MacCutchan

Что - то странное происходит с вашими данными. Последняя строка блока 2 изменяется в комбинированной части. Является ли код, который Вы нам показали, точным кодом, который вы используете?

3 Ответов

Рейтинг:
2

Rick York

В дополнение к двум предыдущим сообщениям, еще одна вещь, которую следует учитывать, - это то, что вы уверены, что оба буфера будут иметь размер 512 байт? Даже если это так, я думаю, что это плохая идея-жестко закодировать значение 512 в вещи. Я бы переписал этот код в функцию, которая принимает два буфера в качестве аргументов вместе с их размерами. Вы можете делать все остальное, как есть, но нигде не должно быть ссылок на 512. Это должен быть размер соответствующего буфера, который был передан в функцию.

Я не собираюсь переписывать ваш код для вас, но я покажу вам, как должен выглядеть прототип :

typedef unsigned char uchar;

uchar * CombineBuffers( uchar * buffer1, size_t buffer1size, uchar * buffer2, size_t buffer2size );
Возвращаемое значение должно быть указателем на Объединенный буфер, который вы выделяете. Я сделал типы данных unsigned char для правильной обработки двоичных данных.


Рейтинг:
2

KarstenK

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

При печати его чем использовать база 64 презентация.

Тебе действительно нужно понять C арифметика указателей Это тяжелая работа, но вы должны понять ее - иначе вы потерпите неудачу.


Richard MacCutchan

Он использует memcpy.

narayan_kumar

Пожалуйста, предположим, что и первый блок, и второй блок имеют ровно 512 байт. Как я могу распечатать их, используя базовое представление 64, чтобы проверить, что я получил все в объединенном блоке?

Пожалуйста, просмотрите мой текущий код и смещения, а также при использовании memcpy.

Рейтинг:
0

OriginalGriff

Проблема, скорее всего, заключается в том, что вы печатаете их как строки, используя %s: в C строки заканчиваются нулевым символом, для которого ваши буферы не оставляют места. Это не похоже на символьные данные, скорее всего, это двоичные данные, и если двоичные данные второго блока содержат нулевой символ, вывод %s завершится.
Поскольку два блока данных, которые вы показываете выше, не имеют одинакового размера, вполне вероятно, что что-то в одном или другом путает проблему, когда она рассматривается как строка.


narayan_kumar

Второй блок, скорее всего, не содержит нулевого символа, так как он печатается полностью сам по себе без проблем. Он усекается только тогда, когда я пытаюсь распечатать его из копии в комбинированном блоке