Added writeUnsignedIntBigEndianBlob.
diff --git a/ndn-cpp/c/encoding/BinaryXMLEncoder.c b/ndn-cpp/c/encoding/BinaryXMLEncoder.c
index ad7a5d1..6111c8c 100644
--- a/ndn-cpp/c/encoding/BinaryXMLEncoder.c
+++ b/ndn-cpp/c/encoding/BinaryXMLEncoder.c
@@ -61,18 +61,17 @@
 }
 
 /**
- * Reverse the length bytes in array starting at offset.
+ * Reverse the length bytes in array.
  * @param array
- * @param offset
  * @param length
  */
-static void reverse(unsigned char *array, unsigned int offset, unsigned int length) 
+static void reverse(unsigned char *array, unsigned int length) 
 {
   if (length == 0)
     return;
   
-  unsigned char *left = array + offset;
-  unsigned char *right = array + offset + length - 1;
+  unsigned char *left = array;
+  unsigned char *right = array + length - 1;
   while (left < right) {
     // Swap.
     unsigned char temp = *left;
@@ -109,7 +108,57 @@
   }
   
   // Now reverse.
-  reverse(self->output.array, startOffset, self->offset - startOffset);
+  reverse(self->output.array + startOffset, self->offset - startOffset);
+  return 0;
+}
+
+/**
+ * Like memcpy, copy length bytes from source to dest, assuming that the buffers can overlap and that
+ * we are shifting the buffer right.
+ * Don't use memcpy to shift because its behavior is not guaranteed when the buffers overlap.
+ * @param dest
+ * @param source
+ * @param length
+ */
+static void copyBufferRight(unsigned char *dest, unsigned char *source, unsigned int length)
+{
+  if (length == 0)
+    return;
+  
+  // We are shifting right, so start from the end of the buffer.
+  unsigned char *from = source + length - 1;
+  unsigned char *to = dest + length - 1;
+  while (from >= source)
+    *(to--) = *(from--);
+}
+
+/**
+ * Shift a buffer in self->output.array right by the amount needed to prefix a header with type, then encode the header
+ * at startOffset.
+ * The buffer to shift right begins at startOffset and self->offset is at the end.
+ * @param self pointer to the ndn_BinaryXMLEncoder struct
+ * @param startOffset the offset in self->output.array of the start of the buffer to shift right
+ * @param type the header type
+ * @return 0 for success, else an error code
+ */
+static ndn_Error insertHeader
+  (struct ndn_BinaryXMLEncoder *self, unsigned int startOffset, unsigned int type)
+{
+  unsigned int nBufferBytes = self->offset - startOffset;
+  unsigned int nHeaderBytes = getNHeaderEncodingBytes(nBufferBytes);
+  ndn_Error error;
+  if (error = ndn_DynamicUCharArray_ensureLength(&self->output, self->offset + nHeaderBytes))
+    return error;
+  
+  copyBufferRight(self->output.array + startOffset + nHeaderBytes, self->output.array + startOffset, nBufferBytes);
+  
+  // Override the offset to force encodeTypeAndValue to encode at startOffset, then fix the offset.
+  self->offset = startOffset;
+  if (error = ndn_BinaryXMLEncoder_encodeTypeAndValue(self, ndn_BinaryXML_UDATA, nBufferBytes))
+    // We don't really expect to get an error, since we have already ensured the length.
+    return error;
+  self->offset = startOffset + nHeaderBytes + nBufferBytes;
+  
   return 0;
 }
 
@@ -195,26 +244,9 @@
   if (error = encodeUnsignedDecimalInt(self, value))
     return error;
   
-  unsigned int nIntegerBytes = self->offset - startOffset;
-  unsigned int nHeaderBytes = getNHeaderEncodingBytes(nIntegerBytes);
-  if (error = ndn_DynamicUCharArray_ensureLength(&self->output, self->offset + nHeaderBytes))
+  if (error = insertHeader(self, startOffset, ndn_BinaryXML_UDATA))
     return error;
   
-  // Don't use memcpy to shift because its behavior is not guaranteed when the buffers overlap.
-  // We are shifting forward, so start from the end of the buffer.
-  unsigned char *source = self->output.array + startOffset + nIntegerBytes - 1;
-  unsigned char *dest = source + nHeaderBytes;
-  unsigned char *sourceFinal = self->output.array + startOffset;
-  while (source >= sourceFinal)
-    *(dest--) = *(source--);
-  
-  // Override the offset to force encodeTypeAndValue to encode at startOffset, then fix the offset.
-  self->offset = startOffset;
-  if (error = ndn_BinaryXMLEncoder_encodeTypeAndValue(self, ndn_BinaryXML_UDATA, nIntegerBytes))
-    // We don't really expect to get an error, since we have already ensured the length.
-    return error;
-  self->offset = startOffset + nHeaderBytes + nIntegerBytes;
-  
   return 0;
 }
 
@@ -232,3 +264,25 @@
   
   return 0;
 }
+
+ndn_Error ndn_BinaryXMLEncoder_writeUnsignedIntBigEndianBlob(struct ndn_BinaryXMLEncoder *self, unsigned int value)
+{
+  // First encode the big endian backwards, then reverse it.
+  unsigned int startOffset = self->offset;
+  ndn_Error error;
+  while (value != 0) {
+    if (error = ndn_DynamicUCharArray_ensureLength(&self->output, self->offset + 1))
+      return error;
+    
+    self->output.array[self->offset++] = (unsigned char)(value & 0xff);
+    value >>= 8;
+  }
+  
+  unsigned int bigEndianLength = self->offset - startOffset;
+  reverse(self->output.array + startOffset, bigEndianLength);
+  
+  if (error = insertHeader(self, startOffset, ndn_BinaryXML_BLOB))
+    return error;
+  
+  return 0;
+}
diff --git a/ndn-cpp/c/encoding/BinaryXMLEncoder.h b/ndn-cpp/c/encoding/BinaryXMLEncoder.h
index a0f288f..c2df389 100644
--- a/ndn-cpp/c/encoding/BinaryXMLEncoder.h
+++ b/ndn-cpp/c/encoding/BinaryXMLEncoder.h
@@ -104,6 +104,14 @@
  */
 ndn_Error ndn_BinaryXMLEncoder_writeUnsignedDecimalIntDTagElement(struct ndn_BinaryXMLEncoder *self, unsigned int tag, unsigned int value);
 
+/**
+ * Write a BLOB header, then the value to self->output encoded as big endian.
+ * @param self pointer to the ndn_BinaryXMLEncoder struct
+ * @param value the unsigned int to encode as big endian.  If value is 0, the big endian encoding has zero bytes.
+ * @return 0 for success, else an error code
+ */
+ndn_Error ndn_BinaryXMLEncoder_writeUnsignedIntBigEndianBlob(struct ndn_BinaryXMLEncoder *self, unsigned int value);
+
 #ifdef	__cplusplus
 }
 #endif