Qt: Option to copy bytes to clipboard as Escaped String

Some users need to copy the bytes to a Python script for
sending out through a raw socket. While they can modify a
plain hex dump, having Wireshark copy directly as a Python
string makes their work easier. This format also works
with Bash, so it is called "Escaped String". E.g.:

	"\x55\xb5\xd4\x67\x03"

Change-Id: I0b6a5eb2e348f686397afda76095aaa2fb85c18d
Reviewed-on: https://code.wireshark.org/review/17696
Petri-Dish: Gilbert Ramirez <gram@alumni.rice.edu>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
Gilbert Ramirez 2016-09-13 22:33:54 -05:00 committed by Anders Broman
parent c711bc6457
commit e8e193694a
7 changed files with 57 additions and 2 deletions

View File

@ -176,6 +176,31 @@ void ByteViewTab::copyBinary(const guint8 *data_p, int data_len)
}
}
void ByteViewTab::copyEscapedString(const guint8 *data_p, int data_len)
{
QString clipboard_text;
// Beginning quote
clipboard_text += QString("\"");
for (int i = 0; i < data_len; i++) {
// Terminate this line if it has reached 16 bytes,
// unless it is also the very last byte in the data,
// as the termination after this for loop will take
// care of that.
if (i % 16 == 0 && i != 0 && i != data_len - 1) {
clipboard_text += QString("\" \\\n\"");
}
clipboard_text += QString("\\x%1").arg(data_p[i], 2, 16, QChar('0'));
}
// End quote
clipboard_text += QString("\"\n");
if (!clipboard_text.isEmpty()) {
qApp->clipboard()->setText(clipboard_text);
}
}
void ByteViewTab::copyData(ByteViewTab::copyDataType copy_type, field_info *fi)
{
int i = 0;
@ -219,6 +244,9 @@ void ByteViewTab::copyData(ByteViewTab::copyDataType copy_type, field_info *fi)
case copyDataBinary:
copyBinary(data_p, data_len);
break;
case copyDataEscapedString:
copyEscapedString(data_p, data_len);
break;
default:
break;
}

View File

@ -44,7 +44,8 @@ public:
copyDataHexDump,
copyDataPrintableText,
copyDataHexStream,
copyDataBinary
copyDataBinary,
copyDataEscapedString
};
explicit ByteViewTab(QWidget *parent = 0);
@ -61,6 +62,7 @@ private:
void copyPrintableText(const guint8 *data_p, int data_len);
void copyHexStream(const guint8 *data_p, int data_len);
void copyBinary(const guint8 *data_p, int data_len);
void copyEscapedString(const guint8 *data_p, int data_len);
protected:
void tabInserted(int index);

View File

@ -616,6 +616,7 @@ private slots:
void on_actionContextCopyBytesPrintableText_triggered();
void on_actionContextCopyBytesHexStream_triggered();
void on_actionContextCopyBytesBinary_triggered();
void on_actionContextCopyBytesEscapedString_triggered();
void on_actionContextShowPacketBytes_triggered();

View File

@ -141,7 +141,7 @@
<x>0</x>
<y>0</y>
<width>960</width>
<height>22</height>
<height>21</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
@ -2925,6 +2925,14 @@
<string>Create firewall ACL rules</string>
</property>
</action>
<action name="actionContextCopyBytesEscapedString">
<property name="text">
<string>…as Escaped String</string>
</property>
<property name="toolTip">
<string>Copy packet bytes as a Escaped string</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>

View File

@ -3788,6 +3788,16 @@ void MainWindow::on_actionContextCopyBytesBinary_triggered()
byte_view_tab_->copyData(ByteViewTab::copyDataBinary, fi);
}
void MainWindow::on_actionContextCopyBytesEscapedString_triggered()
{
QAction *ca = qobject_cast<QAction*>(sender());
if (!ca) return;
field_info *fi = ca->data().value<field_info *>();
byte_view_tab_->copyData(ByteViewTab::copyDataEscapedString, fi);
}
void MainWindow::on_actionContextWikiProtocolPage_triggered()
{
QAction *wa = qobject_cast<QAction*>(sender());

View File

@ -369,6 +369,9 @@ PacketList::PacketList(QWidget *parent) :
action = window()->findChild<QAction *>("actionContextCopyBytesBinary");
submenu->addAction(action);
copy_actions_ << action;
action = window()->findChild<QAction *>("actionContextCopyBytesEscapedString");
submenu->addAction(action);
copy_actions_ << action;
ctx_menu_.addSeparator();
ctx_menu_.addMenu(&proto_prefs_menu_);

View File

@ -241,6 +241,9 @@ ProtoTree::ProtoTree(QWidget *parent) :
action = window()->findChild<QAction *>("actionContextCopyBytesBinary");
submenu->addAction(action);
copy_actions_ << action;
action = window()->findChild<QAction *>("actionContextCopyBytesEscapedString");
submenu->addAction(action);
copy_actions_ << action;
action = window()->findChild<QAction *>("actionContextShowPacketBytes");
ctx_menu_.addAction(action);