天道酬勤,学无止境

Char数组转换为十六进制字符串C ++(Char array to hex string C++)

问题

我在char*之前搜索了hex字符串,但是发现实现在hex字符串的末尾添加了一些不存在的垃圾。 我从套接字收到数据包,我需要将它们转换为hex字符串以记录日志(以空终止的缓冲区)。 有人可以建议我C++的良好实现吗?

谢谢!

回答1

假设数据为char *。 使用std :: hex的工作示例:

for(int i=0; i<data_length; ++i)
    std::cout << std::hex << (int)data[i];

或者,如果您想将所有内容都保留在字符串中:

std::stringstream ss;
for(int i=0; i<data_length; ++i)
    ss << std::hex << (int)data[i];
std::string mystr = ss.str();
回答2

这里是一些东西:

char const hex_chars[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

for( int i = data; i < data_length; ++i )
{
    char const byte = data[i];

    string += hex_chars[ ( byte & 0xF0 ) >> 4 ];
    string += hex_chars[ ( byte & 0x0F ) >> 0 ];
}
回答3

最简单的:

int main()
{
    const char* str = "hello";
    for (const char* p = str; *p; ++p)
    {
        printf("%02x", *p);
    }
    printf("\n");
    return 0;
}
回答4

上面的代码段在字符串中提供了错误的字节顺序,因此我对其进行了一些修复。

char const hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',   'B','C','D','E','F'};

std::string byte_2_str(char* bytes, int size) {
  std::string str;
  for (int i = 0; i < size; ++i) {
    const char ch = bytes[i];
    str.append(&hex[(ch  & 0xF0) >> 4], 1);
    str.append(&hex[ch & 0xF], 1);
  }
  return str;
}
回答5

我在这里找到了一个很好的例子,在C ++中显示字符为十六进制字符串:

  std::vector<char> randomBytes(n);
  file.read(&randomBytes[0], n);

  // Displaying bytes: method 1
  // --------------------------
  for (auto& el : randomBytes)
    std::cout << std::setfill('0') << std::setw(2) << std::hex << (0xff & (unsigned int)el);
  std::cout << '\n';

  // Displaying bytes: method 2
  // --------------------------
  for (auto& el : randomBytes)
    printf("%02hhx", el);
  std::cout << '\n';
  return 0;

上面显示的方法1可能是更C ++的方式:

转换为一个无符号的int
使用std::hex将值表示为十六进制数字
使用<iomanip> std::setwstd::setfill进行格式化
请注意,您需要使用0xff屏蔽0xff转换int以显示最低有效字节:
(0xff & (unsigned int)el)

否则,如果设置了最高位,则强制转换将导致将三个最高有效字节设置为ff

回答6

使用升压:

#include <boost/algorithm/hex.hpp>

std::string s("tralalalala");
std::string result;
boost::algorithm::hex(s.begin(), s.end(), std::back_inserter(result));
回答7

您可以尝试使用此代码将字节从数据包转换为以空值结尾的字符串,然后存储为“ string”变量以进行处理。

const int buffer_size = 2048;
// variable for storing buffer as printable HEX string
char data[buffer_size*2];
// receive message from socket
int ret = recvfrom(sock, buffer, sizeofbuffer, 0, reinterpret_cast<SOCKADDR *>(&from), &size);
// bytes converting cycle
for (int i=0,j=0; i<ret; i++,j+=2){ 
    char res[2]; 
    itoa((buffer[i] & 0xFF), res, 16);
        if (res[1] == 0) {
            data[j] = 0x30; data[j+1] = res[0];
        }else {
            data[j] = res[0]; data[j + 1] = res[1];
        }
}
// Null-Terminating the string with converted buffer
data[(ret * 2)] = 0;

当我们发送十六进制字节0x01020E0F的消息时,变量“ data”具有字符串为“ 01020e0f”的char数组。

回答8

您可以使用std :: hex

例如。

std::cout << std::hex << packet;
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何将十六进制字符串转换为无符号字符数组?(How to turn a hex string into an unsigned char array?)
    问题 例如,我有一个字符串"E8 48 D8 FF FF 8B 0D" (包括空格),需要将其转换为等效的无符号字符数组{0xE8,0x48,0xD8,0xFF,0xFF,0x8B,0x0D} 。 什么是有效的方法? 谢谢! 编辑:我不能使用std库...所以考虑这是一个C问题。 抱歉! 回答1 您永远不会说服我该操作是性能瓶颈。 有效的方法是通过使用标准C库来充分利用您的时间: static unsigned char gethex(const char *s, char **endptr) { assert(s); while (isspace(*s)) s++; assert(*s); return strtoul(s, endptr, 16); } unsigned char *convert(const char *s, int *length) { unsigned char *answer = malloc((strlen(s) + 1) / 3); unsigned char *p; for (p = answer; *s; p++) *p = gethex(s, (char **)&s); *length = p - answer; return answer; } 编译和测试。 适用于您的示例。 回答2 这回答了最初的问题,该问题要求使用C ++解决方案。
  • 将十六进制字符串转换为字节数组(Converting a hex string to a byte array)
    问题 将可变长度的十六进制字符串(例如"01A1"转换为包含该数据的字节数组的最佳方法是什么。 即转换此: std::string = "01A1"; 进入这个 char* hexArray; int hexLength; 或这个 std::vector<char> hexArray; 这样,当我将其写入文件并hexdump -C ,我将获得包含01A1的二进制数据。 回答1 这应该起作用: int char2int(char input) { if(input >= '0' && input <= '9') return input - '0'; if(input >= 'A' && input <= 'F') return input - 'A' + 10; if(input >= 'a' && input <= 'f') return input - 'a' + 10; throw std::invalid_argument("Invalid input string"); } // This function assumes src to be a zero terminated sanitized string with // an even number of [0-9a-f] characters, and target to be sufficiently
  • 如何在C中将字节数组转换为十六进制字符串?(How do you convert a byte array to a hexadecimal string in C?)
    问题 我有: uint8 buf[] = {0, 1, 10, 11}; 我想将字节数组转换为字符串,以便可以使用printf打印该字符串: printf("%s\n", str); 得到(不需要冒号): "00:01:0A:0B" 任何帮助将不胜感激。 回答1 printf("%02X:%02X:%02X:%02X", buf[0], buf[1], buf[2], buf[3]); 对于更通用的方式: int i; for (i = 0; i < x; i++) { if (i > 0) printf(":"); printf("%02X", buf[i]); } printf("\n"); 要连接到字符串,有几种方法可以执行此操作。 我可能会保留一个指向字符串末尾的指针,并使用sprintf。 您还应该跟踪数组的大小,以确保其大小不会超过分配的空间: int i; char* buf2 = stringbuf; char* endofbuf = stringbuf + sizeof(stringbuf); for (i = 0; i < x; i++) { /* i use 5 here since we are going to add at most 3 chars, need a space for the end '\n' and need a null
  • C中的十六进制到char数组(Hex to char array in C)
    问题 给定一串十六进制值,例如“ 0011223344”,即0x00、0x11等。 如何将这些值添加到char数组? 相当于说: char array[4] = { 0x00, 0x11 ... }; 回答1 您无法将价值5个字节的数据放入4个字节的数组中。 导致缓冲区溢出。 如果字符串中包含十六进制数字,则可以使用sscanf()和循环: #include <stdio.h> #include <ctype.h> int main() { const char *src = "0011223344"; char buffer[5]; char *dst = buffer; char *end = buffer + sizeof(buffer); unsigned int u; while (dst < end && sscanf(src, "%2x", &u) == 1) { *dst++ = u; src += 2; } for (dst = buffer; dst < end; dst++) printf("%d: %c (%d, 0x%02x)\n", dst - buffer, (isprint(*dst) ? *dst : '.'), *dst, *dst); return(0); } 注意,打印从零字节开始的字符串需要特别注意。 大多数操作在第一个空字节处终止。
  • C ++将字符串转换为十六进制,反之亦然(C++ convert string to hexadecimal and vice versa)
    问题 在C ++中将字符串转换为十六进制,反之亦然的最佳方法是什么? 例子: 像"Hello World"这样的字符串,以十六进制格式表示: 48656C6C6F20576F726C64 从十六进制48656C6C6F20576F726C64到字符串: "Hello World" 回答1 类似于“ Hello World”的字符串,十六进制格式为:48656C6C6F20576F726C64。 啊,你去: #include <string> std::string string_to_hex(const std::string& input) { static const char hex_digits[] = "0123456789ABCDEF"; std::string output; output.reserve(input.length() * 2); for (unsigned char c : input) { output.push_back(hex_digits[c >> 4]); output.push_back(hex_digits[c & 15]); } return output; } #include <stdexcept> int hex_value(unsigned char hex_digit) { static const signed char
  • 在Java中,如何在保持前导零的同时将字节数组转换为十六进制数字的字符串? [复制](In Java, how do I convert a byte array to a string of hex digits while keeping leading zeros? [duplicate])
    问题 这个问题已经在这里有了答案: 如何在Java中将字节数组转换为十六进制字符串? (29个答案) 1年前关闭。 我正在使用一些示例Java代码来制作md5哈希值。 一部分将结果从字节转换为一串十六进制数字: byte messageDigest[] = algorithm.digest(); StringBuffer hexString = new StringBuffer(); for (int i=0;i<messageDigest.length;i++) { hexString.append(Integer.toHexString(0xFF & messageDigest[i])); } 但是,由于toHexString显然掉了前导零,所以它并不起作用。 那么,从字节数组到保持前导零的十六进制字符串最简单的方法是什么? 回答1 一种简单的方法是检查Integer.toHexString()输出多少位数,并在需要时在每个字节前添加前导零。 像这样的东西: public static String toHexString(byte[] bytes) { StringBuilder hexString = new StringBuilder(); for (int i = 0; i < bytes.length; i++) { String hex = Integer
  • byte []转换为十六进制字符串[duplicate](byte[] to hex string [duplicate])
    问题 这个问题已经在这里有了答案: 如何将字节数组转换为十六进制字符串,反之亦然? (48个答案) 5年前关闭。 如何将byte[]转换为string ? 每次尝试,我都会得到 System.Byte [] 而不是价值。 另外,如何获取十六进制而不是十进制的值? 回答1 为此有一个内置方法: byte[] data = { 1, 2, 4, 8, 16, 32 }; string hex = BitConverter.ToString(data); 结果:01-02-04-08-10-20 如果您希望它没有破折号,则将其删除: string hex = BitConverter.ToString(data).Replace("-", string.Empty); 结果:010204081020 如果要更紧凑的表示形式,可以使用Base64: string base64 = Convert.ToBase64String(data); 结果:AQIECBAg 回答2 我以为我会比较这里列出的每种方法的速度。 我以此为基础建立了速度测试代码。 结果是BitConverter + String.Replace似乎比大多数其他简单方法都快。 但是可以使用Nathan Moinvaziri的ByteArrayToHexString或Kurt的ToHex之类的算法来提高速度。 对于长字符串
  • Matlab字符串 字符串数组 数据类型转换
    字符串 https://ww2.mathworks.cn/help/matlab/characters-and-strings.html 创建字符向量 通过将字符序列括在单引号中来创建一个字符向量。 chr = 'Hello, world' chr = 'Hello, world' 字符向量为 char 类型的 1×n 数组。在计算机编程中,字符串是表示 1×n 字符数组的常用术 语。但是,从 R2016b 开始,MATLAB 同时提供 string 数据类型,因此 1×n 字符数组在 MATLAB 文档中称为字符向量。 whos chr Name Size Bytes Class Attributes chr 1x12 24 char 如果文本包含单个引号,请在分配字符向量时放入两个引号。 newChr = 'You''re right' newChr = 'You're right' uint16 等函数将字符转换为其数值代码。 chrNumeric = uint16(chr) chrNumeric = 1×12 uint16 row vector 72 101 108 108 111 44 32 119 111 114 108 100 char 函数将整数向量重新转换为字符。 chrAlpha = char([72 101 108 108 111 44 32 119 111
  • 如何在C中将整数转换为十六进制字符串?(How can I convert an integer to a hexadecimal string in C?)
    问题 如何在C中将整数转换为十六进制字符串? 示例:整数50将转换为十六进制字符串"32"或"0x32" 。 回答1 这段代码 int a = 5; printf("%x\n", a); 印刷 5 这段代码 int a = 5; printf("0x%x\n", a); 印刷 0x5 这段代码 int a = 89778116; printf("%x\n", a); 印刷 559e7c4 如果将x的格式大写,则将其十六进制值大写: int a = 89778116; printf("%X\n", a); 印刷 559E7C4 如果要打印指针,请使用p格式说明符: char* str = "foo"; printf("0x%p\n", str); 印刷 0x01275744 回答2 以下代码接受一个整数,并以十六进制格式从中产生一个字符串: int num = 32424; char hex[5]; sprintf(hex, "%x", num); puts(hex); 给 7ea8 回答3 通常与%x格式说明符一起用于printf (或其表亲之一)。 回答4 有趣的是,这些答案像给定的那样利用printf 。 printf将整数转换为十六进制字符串值。 //************************************************************* /
  • 十六进制字符串到C中的字节数组(Hexadecimal string to byte array in C)
    问题 是否有标准的C函数将十六进制字符串转换为字节数组? 我不想编写自己的函数。 回答1 据我所知,尚无标准功能,但可以通过以下方式轻松实现: #include <stdio.h> int main(int argc, char **argv) { const char hexstring[] = "DEadbeef10203040b00b1e50", *pos = hexstring; unsigned char val[12]; /* WARNING: no sanitization or error-checking whatsoever */ for (size_t count = 0; count < sizeof val/sizeof *val; count++) { sscanf(pos, "%2hhx", &val[count]); pos += 2; } printf("0x"); for(size_t count = 0; count < sizeof val/sizeof *val; count++) printf("%02x", val[count]); printf("\n"); return 0; } 编辑 正如Al所指出的,如果字符串中的十六进制数字为奇数,则必须确保以0开头。例如,字符串"f00f5"将被评估为{0xf0, 0x0f, 0x05
  • 如何在Java中将字节数组转换为十六进制格式(How to convert byte array to hex format in Java)
    问题 我知道您可以使用printf ,也可以使用StringBuilder.append(String.format("%x", byte))将值转换为HEX值并在控制台上显示它们。 但是我希望能够实际格式化字节数组,以便每个字节显示为十六进制而不是十进制。 这是我的代码的一部分,已经完成了前面所述的两种方式: if(bytes > 0) { byteArray = new byte[bytes]; // Set up array to receive these values. for(int i=0; i<bytes; i++) { byteString = hexSubString(hexString, offSet, CHARSPERBYTE, false); // Isolate digits for a single byte. Log.d("HEXSTRING", byteString); if(byteString.length() > 0) { byteArray[i] = (byte)Integer.parseInt(byteString, 16); // Parse value into binary data array. } else { System.out.println("String is empty!"); } offSet +=
  • Javascript ArrayBuffer转换为十六进制(Javascript ArrayBuffer to Hex)
    问题 我有一个Javascript ArrayBuffer,我想将其转换为十六进制字符串。 有人知道我可以调用的功能或已经存在的预先编写的功能吗? 我只能找到用于字符串函数的arraybuffer,但是我想改为使用arraybuffer的hexdump。 回答1 function buf2hex(buffer) { // buffer is an ArrayBuffer return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join(''); } // EXAMPLE: const buffer = new Uint8Array([ 4, 8, 12, 16 ]).buffer; console.log(buf2hex(buffer)); // = 04080c10 此功能分为四个步骤: 将缓冲区转换为数组。 对于每个x数组,它将元素转换为十六进制字符串(例如12变为c )。 然后使用该十六进制字符串,并用零0c它(例如, c变为0c )。 最后,它接受所有十六进制值并将它们连接到单个字符串中。 下面是另一个更长的实现,虽然有点易于理解,但实际上执行的是相同的操作: function buf2hex(buffer) { // buffer is
  • 在Java中将十六进制字符串转换为ASCII(Convert a String of Hex into ASCII in Java)
    问题 我希望这不是一个愚蠢的问题,我在Google搜索结果的5个不同页面上进行了浏览,但未能在此找到任何内容。 我需要做的是例如将包含所有十六进制字符的字符串转换为ASCII String fileName =
  • C ++将十六进制字符串转换为有符号整数(C++ convert hex string to signed integer)
    问题 我想将十六进制字符串转换为C ++中的32位带符号整数。 因此,例如,我有一个十六进制字符串“ fffefffe”。 其二进制表示为11111111111111101111111111111110。其带符号整数表示为:-65538。 如何在C ++中进行此转换? 这也需要适用于非负数。 例如,十六进制字符串“ 0000000A”(二进制为00000000000000000000000000001010),十进制为10。 回答1 使用std::stringstream unsigned int x; std::stringstream ss; ss << std::hex << "fffefffe"; ss >> x; 以下示例将产生-65538作为其结果: #include <sstream> #include <iostream> int main() { unsigned int x; std::stringstream ss; ss << std::hex << "fffefffe"; ss >> x; // output it as a signed type std::cout << static_cast<int>(x) << std::endl; } 在新的C ++ 11标准中,可以使用一些新的实用程序功能! 具体来说,有一类“字符串到数字”功能(http:/
  • Java代码将字节转换为十六进制(Java code To convert byte to Hexadecimal)
    问题 我有一个字节数组。 我希望将该数组的每个字节String转换为其对应的十六进制值。 Java中是否有任何函数可以将字节数组转换为十六进制? 回答1 byte[] bytes = {-1, 0, 1, 2, 3 }; StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(String.format("%02X ", b)); } System.out.println(sb.toString()); // prints "FF 00 01 02 03 " 也可以看看 java.util.Formatter语法%[flags][width]conversion 标志'0' 0'-结果将补零宽度2 转换'X'结果格式为十六进制整数,大写 查看问题的文本,也可能是这样要求的: String[] arr = {"-1", "0", "10", "20" }; for (int i = 0; i < arr.length; i++) { arr[i] = String.format("%02x", Byte.parseByte(arr[i])); } System.out.println(java.util.Arrays.toString(arr)); // prints "[ff, 00, 0a
  • Java计算String的SHA-1摘要的十六进制表示形式(Java calculate hex representation of a SHA-1 digest of a String)
    问题 我将用户密码作为sha1哈希存储在数据库中。 不幸的是,我得到了奇怪的答案。 我将字符串存储为: MessageDigest cript = MessageDigest.getInstance("SHA-1"); cript.reset(); cript.update(userPass.getBytes("utf8")); this.password = new String(cript.digest()); 我想要这样的东西-> aff->“ 0c05aa56405c447e6678b7f3127febde5c3a9238” 而不是 aff->``V @ \ D〜fx : 8 回答1 发生这种情况是因为cript.digest()返回一个字节数组,您正尝试将其打印为字符串String。 您要将其转换为可打印的十六进制字符串。 简单的解决方案:使用Apache的commons-codec库: String password = new String(Hex.encodeHex(cript.digest()), CharSet.forName("UTF-8")); 回答2 使用apache通用编解码器库: DigestUtils.sha1Hex("aff") 结果是0c05aa56405c447e6678b7f3127febde5c3a9238 就是这样 :) 回答3
  • printf将额外的FFFFFF添加到来自char数组的十六进制打印中[重复](printf adds extra `FFFFFF` to hex print from a char array [duplicate])
    问题 这个问题已经在这里有了答案: 为什么在打印十六进制时printf不能仅输出一个字节? (5个答案) 4年前关闭。 考虑下面的简化代码。 我想从文件中提取一些二进制数据/流,并以十六进制格式将其打印到标准输出中。 我得到了额外的3个字节0xFFFFFF 。 怎么了? 多余的字节从何而来? 输出 in: 2000FFFFFFAF00690033005A00 out: 2000FFFFFFAF00690033005A00 程式 #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { int i; char raw[10] = {0x20,0x00,0xAF,0x00,0x69,0x00,0x33,0x00,0x5A,0x00}; FILE *outfile; char *buf; printf("in:\n\t"); for( i=0; i<10; i++ ) printf("%02X", raw[i]); outfile = fopen("raw_data.bin", "w+b"); fwrite(raw, 1, 10, outfile); buf = (char *) malloc (32 * sizeof(char)); fseek(outfile, 0, SEEK_SET)
  • 我如何使用ostream在c ++中将未签名的char打印为十六进制?(how do I print an unsigned char as hex in c++ using ostream?)
    问题 我想在C ++中使用无符号的8位变量。 就算术而言, unsigned char或uint8_t问题(这是可以预期的,因为AFAIK uint8_t只是unsigned char的别名,所以调试器会显示出来。 问题是,如果我在C ++中使用ostream打印出变量,则会将其视为char。 如果我有: unsigned char a = 0; unsigned char b = 0xff; cout << "a is " << hex << a <<"; b is " << hex << b << endl; 那么输出是: a is ^@; b is 377 代替 a is 0; b is ff 我尝试使用uint8_t ,但是正如我之前提到的,将typedef定义为unsigned char ,所以它也做同样的事情。 如何正确打印变量? 编辑:我在代码中的许多地方都这样做。 有什么方法可以在每次打印时都将其转换为int而不用将其转换为int吗? 回答1 我建议使用以下技术: struct HexCharStruct { unsigned char c; HexCharStruct(unsigned char _c) : c(_c) { } }; inline std::ostream& operator<<(std::ostream& o, const
  • web服务(openAPI)鉴权的一种实现方法、思路
    1、服务端生成uuid 2、根据uuid生成accessKey ak,把uuid,ak手动提供给调用方,ak的生成过程对客户端代码屏蔽。 3、客户端调用方根据如下方法 生成签名sk,参见SecTest.java: public static String genSignature(String ak,String timestamp,String serviceName); 4、服务调用时 ,提供uuid,ak,timestamp,serviceName,sk 5、服务端首先比较timestamp:时间差控制在一分钟内算合法请求,再根据uuid,timestamp,serviceName生成签名和客户端生成的sk比较是否一致,不一致则非法请求。这样调用服务时,客户端请求URL不变的情况下,根据timestamp可以控制请求的有效时间,缩小受***的时间范围。 url参数改变的情况,客户端生成的sk 不可能与服务端一致,除非能同时看到客户端、服务端的算法代码。 主要参考资料如下:http://itindex.net/detail/47960-云存储-http-鉴权 http://docs.aws.amazon.com/zh_cn/general/latest/gr/signature-v4-examples.html 示例代码如下: public class SecTest {
  • 如何将十六进制字符串转换为字节数组? [复制](How can I convert a hex string to a byte array? [duplicate])
    问题 这个问题已经在这里有了答案: 如何将字节数组转换为十六进制字符串,反之亦然? (48个答案) 3年前关闭。 我们是否可以使用C#中的内置函数将十六进制字符串转换为字节数组,还是必须为此创建自定义方法? 回答1 这是一个有趣的LINQ示例。 public static byte[] StringToByteArray(string hex) { return Enumerable.Range(0, hex.Length) .Where(x => x % 2 == 0) .Select(x => Convert.ToByte(hex.Substring(x, 2), 16)) .ToArray(); } 回答2 我做了一些研究,发现byte.Parse比Convert.ToByte还要慢。 我能想到的最快的转换大约每字节使用15个滴答声。 public static byte[] StringToByteArrayFastest(string hex) { if (hex.Length % 2 == 1) throw new Exception("The binary key cannot have an odd number of digits"); byte[] arr = new byte[hex.Length >> 1]; for (int i = 0; i < hex