16进制转字符串如何转换?

ི李政(微信小程序) 2018-11-14 10:57:23
string udp = "0C EF AF C4 07 00 00 01 00 00 0C EF AF C4 07 00 03 2A 02 00 32 30 31 38 36 35 39 31 34 32 33 00 00 00 00 00 02 00 00 00 B9 00 00 00 00 00 00 00 00 01 0C 51 01 5D 5C 4E 00 01 00 01 00 00";

string wifi = HexStringToString(udp, System.Text.Encoding.Default); //这里是乱码 "\f锆?\0\0\u0001\0\0\f锆?\0\u0003*\u0002\020186591423\0\0\0\0\0\u0002\0\0\0?\0\0\0\0\0\0\0\u0001\fQ\u0001]\\N\0\u0001\0\u0001\0\0"

private string HexStringToString(string hs, Encoding encode)
{
string strTemp=hs.Replace(" ", "");
string temp = string.Empty;
byte[] b=new byte[strTemp.Length/2];
for (int i = 0; i < strTemp.Length / 2; i++)
{
temp = strTemp.Substring(i * 2, 2);
b[i] = Convert.ToByte(temp, 16);
}
//按照指定编码将字节数组变为字符串
return encode.GetString(b);
}
...全文
350 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2018-11-16
  • 打赏
  • 举报
回复
C 代码是 printf("Rssi:%d\n", package_data->Rssi);
C# 就写作 Console.WriteLine("RSSI:{0}", obj.Rssi);

C 的格式化串 %d 表示输出10进制整数,%02X 表示输出两位16进制数,不足则补0
  • 打赏
  • 举报
回复
引用 14 楼 xuzuning 的回复:
            string udp = "0C EF AF C4 07 00 00 01 00 00 0C EF AF C4 07 00 03 2A 02 00 32 30 31 38 36 35 39 31 34 32 33 00 00 00 00 00 02 00 00 00 B9 00 00 00 00 00 00 00 00 01 0C 51 01 5D 5C 4E 00 01 00 01 00 00";
            var b = udp.Split(' ').Select(x => Convert.ToByte(x, 16)).ToArray();
            Console.WriteLine("结构长:{0}", Marshal.SizeOf(new cliprobe_data()));
            var obj = (cliprobe_data)BytesToStuct(b, typeof(cliprobe_data));

            Console.WriteLine("APMAC:{0}", BitConverter.ToString(obj.Apmac,0).Replace("-",""));
            Console.WriteLine("BSSID:{0}", BitConverter.ToString(obj.Bssid, 0).Replace("-", ""));
            Console.WriteLine("Climac:{0}", BitConverter.ToString(obj.Mumac, 0).Replace("-", ""));
            Console.WriteLine("Timestamp:{0}", new string(obj.Timestamp.Select(c=>(char)c).ToArray()));
结构长:59
APMAC:0CEFAFC40700
BSSID:0CEFAFC40700
Climac:0000010C5101
Timestamp:20186591423
你实际收到的就是 byte[],做转换只是为了交流方便 你提供的数据有 62 字节长,而结构 cliprobe_data 实际只有 59 个字节。请认真核对偏差的原因 cliprobe_data 结构
        [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
        public struct cliprobe_data
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
            public byte[] Apmac;
            public UInt16 Vendorid;
            public UInt16 Reserved1;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
            public byte[] Bssid;
            public byte Radiotype;
            public byte Channel;
            public byte Associated;
            public byte Messagetype;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 14)]
            public byte[] Timestamp;
            public UInt16 Reserved2;
            public byte Mutype;
            public UInt16 Reserved3;
            public byte Rssi;
            public UInt16 Reserved4;
            public byte Noisefloor;
            public UInt16 Reserved5;
            public byte Datarate;
            public byte MPDUflags;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
            public byte[] Mumac;
            public UInt16 Framecontrol;
            public UInt16 Sequencecontrol;
            public UInt16 Reserved6;
        }
转换用的工作函数
        //// <summary>
        /// 结构体转byte数组
        /// </summary>
        /// <param name="structObj">要转换的结构体</param>
        /// <returns>转换后的byte数组</returns>
        public static byte[] StructToBytes(object structObj)
        {
            //得到结构体的大小
            int size = Marshal.SizeOf(structObj);
            //创建byte数组
            byte[] bytes = new byte[size];
            //分配结构体大小的内存空间
            IntPtr structPtr = Marshal.AllocHGlobal(size);
            //将结构体拷到分配好的内存空间
            Marshal.StructureToPtr(structObj, structPtr, false);
            //从内存空间拷到byte数组
            Marshal.Copy(structPtr, bytes, 0, size);
            //释放内存空间
            Marshal.FreeHGlobal(structPtr);
            //返回byte数组
            return bytes;
        }

        /// <summary>
        /// byte数组转结构体
        /// </summary>
        /// <param name="bytes">byte数组</param>
        /// <param name="type">结构体类型</param>
        /// <returns>转换后的结构体</returns>
        public static object BytesToStuct(byte[] bytes, Type type)
        {
            //得到结构体的大小
            int size = Marshal.SizeOf(type);
            //byte数组长度小于结构体的大小
            if (size > bytes.Length)
            {
                //返回空
                return null;
            }
            //分配结构体大小的内存空间
            IntPtr structPtr = Marshal.AllocHGlobal(size);
            //将byte数组拷到分配好的内存空间
            Marshal.Copy(bytes, 0, structPtr, size);
            //将内存空间转换为目标结构体
            object obj = Marshal.PtrToStructure(structPtr, type);
            //释放内存空间
            Marshal.FreeHGlobal(structPtr);
            //返回结构体
            return obj;
        }
谢谢 xuzuning Rssi的值转换是这样转换的吗? Console.WriteLine("RSSI:{0}",Convert.ToString(obj.Rssi, 16));
xuzuning 2018-11-15
  • 打赏
  • 举报
回复
            string udp = "0C EF AF C4 07 00 00 01 00 00 0C EF AF C4 07 00 03 2A 02 00 32 30 31 38 36 35 39 31 34 32 33 00 00 00 00 00 02 00 00 00 B9 00 00 00 00 00 00 00 00 01 0C 51 01 5D 5C 4E 00 01 00 01 00 00";
var b = udp.Split(' ').Select(x => Convert.ToByte(x, 16)).ToArray();
Console.WriteLine("结构长:{0}", Marshal.SizeOf(new cliprobe_data()));
var obj = (cliprobe_data)BytesToStuct(b, typeof(cliprobe_data));

Console.WriteLine("APMAC:{0}", BitConverter.ToString(obj.Apmac,0).Replace("-",""));
Console.WriteLine("BSSID:{0}", BitConverter.ToString(obj.Bssid, 0).Replace("-", ""));
Console.WriteLine("Climac:{0}", BitConverter.ToString(obj.Mumac, 0).Replace("-", ""));
Console.WriteLine("Timestamp:{0}", new string(obj.Timestamp.Select(c=>(char)c).ToArray()));
结构长:59
APMAC:0CEFAFC40700
BSSID:0CEFAFC40700
Climac:0000010C5101
Timestamp:20186591423
你实际收到的就是 byte[],做转换只是为了交流方便
你提供的数据有 62 字节长,而结构 cliprobe_data 实际只有 59 个字节。请认真核对偏差的原因
cliprobe_data 结构
        [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct cliprobe_data
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] Apmac;
public UInt16 Vendorid;
public UInt16 Reserved1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] Bssid;
public byte Radiotype;
public byte Channel;
public byte Associated;
public byte Messagetype;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 14)]
public byte[] Timestamp;
public UInt16 Reserved2;
public byte Mutype;
public UInt16 Reserved3;
public byte Rssi;
public UInt16 Reserved4;
public byte Noisefloor;
public UInt16 Reserved5;
public byte Datarate;
public byte MPDUflags;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] Mumac;
public UInt16 Framecontrol;
public UInt16 Sequencecontrol;
public UInt16 Reserved6;
}

转换用的工作函数
        //// <summary>
/// 结构体转byte数组
/// </summary>
/// <param name="structObj">要转换的结构体</param>
/// <returns>转换后的byte数组</returns>
public static byte[] StructToBytes(object structObj)
{
//得到结构体的大小
int size = Marshal.SizeOf(structObj);
//创建byte数组
byte[] bytes = new byte[size];
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将结构体拷到分配好的内存空间
Marshal.StructureToPtr(structObj, structPtr, false);
//从内存空间拷到byte数组
Marshal.Copy(structPtr, bytes, 0, size);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
//返回byte数组
return bytes;
}

/// <summary>
/// byte数组转结构体
/// </summary>
/// <param name="bytes">byte数组</param>
/// <param name="type">结构体类型</param>
/// <returns>转换后的结构体</returns>
public static object BytesToStuct(byte[] bytes, Type type)
{
//得到结构体的大小
int size = Marshal.SizeOf(type);
//byte数组长度小于结构体的大小
if (size > bytes.Length)
{
//返回空
return null;
}
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将byte数组拷到分配好的内存空间
Marshal.Copy(bytes, 0, structPtr, size);
//将内存空间转换为目标结构体
object obj = Marshal.PtrToStructure(structPtr, type);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
//返回结构体
return obj;
}

123321... 2018-11-15
  • 打赏
  • 举报
回复
/// <summary>
/// 两个字节加一个空格
/// </summary>
/// <param name="_sendMessage">文本字符串命令</param>
/// <returns>string</returns>
public static string GetStringFromList(List<byte> _sendMessage)
{
string str = "";
foreach (byte item in _sendMessage)
{
str += item.ToString("X").PadLeft(2, '0') + " ";
}
return str;
}
byte数组是16进制的
freesky20 2018-11-14
  • 打赏
  • 举报
回复

 string hexValues = "0C EF AF C4 07 00 00 01 00 00 0C EF AF C4 07 00 03 2A 02 00 32 30 31 38 36 35 39 31 34 32 33 00 00 00 00 00 02 00 00 00 B9 00 00 00 00 00 00 00 00 01 0C 51 01 5D 5C 4E 00 01 00 01 00 00";
 string[] hexValuesSplit = hexValues.Split(' ');

 private string HexStringToString(string hs)
    {
		//string stringValue=null;
		char charValue=null;		
		foreach (String hex in hs)
		{
		// Convert the number expressed in base-16 to an integer.
		int value = Convert.ToInt32(hex, 16);
		// Get the character corresponding to the integral value.
		//stringValue =+ Char.ConvertFromUtf32(value);
		charValue =+ (char)value;			
		}
		return charValue;
      
    }


  • 打赏
  • 举报
回复
引用 5 楼 starfd 的回复:
我知道是乱码,所以后面说了不是简单的直接Encoding GetString,你需要咨询下这个字符串怎么生成的


下面的代码是用C语言获取到的正常的字符串数据,你能看出来怎么生成的或是用C#如何解析吗?

*************************************************************************
> File Name: server.c
> Author: SongLee
************************************************************************/
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<netdb.h>
#include<stdarg.h>
#include<string.h>

#define SERVER_PORT 2222
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512

struct cliprobe_data {
unsigned char Apmac[6];
unsigned short int Vendorid;
unsigned short int Reserved1;
unsigned char Bssid[6];
unsigned char Radiotype;
unsigned char Channel;
unsigned char Associated;
unsigned char Messagetype;
char Timestamp[14];
unsigned short int Reserved2;
unsigned char Mutype;
unsigned short int Reserved3;
char Rssi;
unsigned short int Reserved4;
unsigned char Noisefloor;
unsigned short int Reserved5;
unsigned char Datarate;
unsigned char MPDUflags;
unsigned char Mumac[6];
unsigned short int Framecontrol;
unsigned short int Sequencecontrol;
unsigned short int Reserved6;
};

int main()
{
/* 创建UDP套接口 */
int i;
struct cliprobe_data *package_data;
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(SERVER_PORT);

/* 创建socket */
int server_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
if(server_socket_fd == -1)
{
perror("Create Socket Failed:");
exit(1);
}

/* 绑定套接口 */
if(-1 == (bind(server_socket_fd,(struct sockaddr*)&server_addr,sizeof(server_addr))))
{
perror("Server Bind Failed:");
exit(1);
}

/* 数据传输 */
while(1)
{
/* 定义一个地址,用于捕获客户端地址 */
struct sockaddr_in client_addr;
socklen_t client_addr_length = sizeof(client_addr);

/* 接收数据 */
char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);
if(recvfrom(server_socket_fd, buffer, BUFFER_SIZE,0,(struct sockaddr*)&client_addr, &client_addr_length) == -1)
{
perror("Receive Data Failed:");
exit(1);
}

/* 从buffer中拷贝出file_name */
//char file_name[FILE_NAME_MAX_SIZE+1];
//bzero(file_name,FILE_NAME_MAX_SIZE+1);
//strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));
package_data = (struct cliprobe_data *) buffer;
printf("APMAC:%02X%02X%02X%02X%02X%02X\n", package_data->Apmac[0], package_data->Apmac[1], package_data->Apmac[2], \
package_data->Apmac[3], package_data->Apmac[4], package_data->Apmac[5]);

printf("BSSID:%02X%02X%02X%02X%02X%02X\n", package_data->Bssid[0], package_data->Bssid[1], package_data->Bssid[2], \
package_data->Bssid[3], package_data->Bssid[4], package_data->Bssid[5]);
printf("Radiotyep:%02X\n", package_data->Radiotype);
printf("Channel:%d\n", package_data->Channel);
printf("Timestamp:");
for (i=0;i<14;i++) {
printf("%c", package_data->Timestamp[i]);
}
printf("\n");
printf("Rssi:%d\n", package_data->Rssi);
printf("Climac:%02X%02X%02X%02X%02X%02X\n", package_data->Mumac[0], package_data->Mumac[1], package_data->Mumac[2], \
package_data->Mumac[3], package_data->Mumac[4], package_data->Mumac[5]);
}
close(server_socket_fd);
return 0;
}
  • 打赏
  • 举报
回复
我知道是乱码,所以后面说了不是简单的直接Encoding GetString,你需要咨询下这个字符串怎么生成的
sdfgrtyu 2018-11-14
  • 打赏
  • 举报
回复
引用 3 楼 weixin_42317062 的回复:
娃都会打酱油了:
我运行了你的代码也还是乱码:
"\f��\a\0\0\u0001\0\0\f��\a\0\u0003*\u0002\020186591423\0\0\0\0\0\u0002\0\0\0�\0\0\0\0\0\0\0\0\u0001\fQ\u0001]\\N\0\u0001\0\u0001\0\0"

恩·,是不是编码不对
en
  • 打赏
  • 举报
回复
娃都会打酱油了:
我运行了你的代码也还是乱码:
"\f��\a\0\0\u0001\0\0\f��\a\0\u0003*\u0002\020186591423\0\0\0\0\0\u0002\0\0\0�\0\0\0\0\0\0\0\0\u0001\fQ\u0001]\\N\0\u0001\0\u0001\0\0"
  • 打赏
  • 举报
回复
            string udp = "0C EF AF C4 07 00 00 01 00 00 0C EF AF C4 07 00 03 2A 02 00 32 30 31 38 36 35 39 31 34 32 33 00 00 00 00 00 02 00 00 00 B9 00 00 00 00 00 00 00 00 01 0C 51 01 5D 5C 4E 00 01 00 01 00 00";
            var arr = Regex.Matches(udp, @"\w{2}").Cast<Match>().Select(s => Convert.ToByte(s.Value, 16)).ToArray();
            Console.WriteLine(Encoding.UTF8.GetString(arr));
只能说明这byte[]不是直接可以转成字符串的,你需要知道它是如何生成的
dugupiaoyun 2018-11-14
  • 打赏
  • 举报
回复
System.Text.Encoding.Default这个的问题吧,确定不用UTF8?
尼古拉斯土豆 2018-11-14
  • 打赏
  • 举报
回复
方法一:
string input = "Hello World!";
char[] values = input.ToCharArray();
foreach (char letter in values)
{
// Get the integral value of the character.
int value = Convert.ToInt32(letter);
// Convert the decimal value to a hexadecimal value in string form.
string hexOutput = String.Format("{0:X}", value);
Console.WriteLine("Hexadecimal value of {0} is {1}", letter, hexOutput);
}

方法二:
string hexValues = "48 65 6C 6C 6F 20 57 6F 72 6C 64 21";
string[] hexValuesSplit = hexValues.Split(' ');
foreach (String hex in hexValuesSplit)
{
// Convert the number expressed in base-16 to an integer.
int value = Convert.ToInt32(hex, 16);
// Get the character corresponding to the integral value.
string stringValue = Char.ConvertFromUtf32(value);
char charValue = (char)value;
Console.WriteLine("hexadecimal value = {0}, int value = {1}, char value = {2} or {3}",
hex, value, stringValue, charValue);
}
xuzuning 2018-11-14
  • 打赏
  • 举报
回复
C代码的 cliprobe_data 结构中的 unsigned char Apmac[6]; 对应 0C EF AF C4 07 00
显然不能转成 C# 的 char[],再说 C 代码是 这样输出的
printf("APMAC:%02X%02X%02X%02X%02X%02X\n", package_data->Apmac[0], package_data->Apmac[1], package_data->Apmac[2], \
package_data->Apmac[3], package_data->Apmac[4], package_data->Apmac[5]);
得到的是 APMAC:0CEFAFC40700 这样的内容
牧歌ing 2018-11-14
  • 打赏
  • 举报
回复

string strSource="大家是否来得及时"
byte[] byteArray = System.Text.Encoding.Default.GetBytes ( strSource);

string str = System.Text.Encoding.Default.GetString ( byteArray );

你可以用 这种

enaking 2018-11-14
  • 打赏
  • 举报
回复
嗯,你这个需要了解来源及编码方式。也有可能是来源公司自己特有的编码。你应该资讯一下数据来源公司。
Nick大帅仔 2018-11-14
  • 打赏
  • 举报
回复
如果是通讯,我个人觉得应该直接定义一个 byte[] 数组来接收你的消息,然后从数组再转换成string 类型展示。

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧