我需要使用串行端口向硬件(SDZ16矩阵)发送一个字节数组。诀窍在于硬件需要十六进制和ASCII字符串。
将值分配给字节数组时,即使我将字节设置为显式十六进制值
(例如,bytes[0] = 0xF2
),它将打印等效的十进制值(242而不是F2)。
我怀疑问题出现在Console.WriteLine();
中,当打印每个字节时默认设置为整数(?)C#如何跟踪int内部是否存在十六进制值?
如果我指定bytes[0] = 0xF2;
硬件是否会以十六进制理解它,即使Console.WriteLine();
显示不同也会测试?
答案 0 :(得分:1)
如果您想以十六进制格式获取字符串表示形式,可以使用相应的numeric format string:
byte value = 0xF2;
string hexString = string.Format("{0:X2}", value);
请注意Console.WriteLine
有一个带有格式字符串和参数列表的重载:
Console.WriteLine("{0:X2}", value);
更新:我刚看了一下文档here,看来你需要通过以字符串的形式提供相应的ASCII表示来发送命令。您可以使用以下命令获取ASCII表示:
byte value = 0x01;
string textValue = value.ToString().PadLeft(2, '0');
byte[] ascii = Encoding.ASCII.GetBytes(textValue)
我的建议是仔细检查设备的文档,找出预期的确切格式。
答案 1 :(得分:0)
它将打印等效的十进制值(242而不是F2)。
是的,因为0xF2
仍然是242
。它只是一个hexadecimal notation。此符号中的大多数comman前缀为0x
。即使您使用调试器,也可以看到它是decimal notation。
我怀疑问题出在Console.WriteLine();哪一个 当打印每个字节时,默认情况下将它们设置为整数(?)
不,Console.WriteLine()
method这里什么也没做。
C#如何跟踪内部存在十六进制值 诠释?
int 中没有十六进制值这样的东西。它只是一个notation。
如果你想要一个数字的十六进制表示法,你可以使用The hexadecimal "X"
format specifier之类的;
byte b = 0xF2;
Console.WriteLine(b.ToString("X")); //F2
如果你想获得前缀;你可以做;
byte b = 0xF2;
Console.WriteLine("0x{0}", b.ToString("X")); //0xF2