【问题标题】:Best way to parse ASCII(?) from a hex string in C#从 C# 中的十六进制字符串解析 ASCII(?) 的最佳方法
【发布时间】:2018-08-02 21:42:43
【问题描述】:

我在应用程序中得到的字符串包括 ASCII(?) 字符,例如 !,dp,\b,(,s@.

这些应该是等价的。

数据库中的值-

\x01\x01\x03!\xea\x01\x00\x00dP\x00\x00\x1f\x8b\b\x00\x00\x00\x00\x00\x04\x00\xe3\xe6\x10\x11\x98\xc3(\xc1\xa2\xc0\xa8\xc0\xa0 \x02\xc4\x0c\x1a\x8c\x1a\x0c\x1as@\x04\x18\xf2\b\x1de\xe6\xe6\xe2\xe2b604\x14`\x94\x98\xc3\ba\x9b\"\xb1M\x80\xec\xc9\x10\xb6\x81\x05\x90=\t\xca6Ab[\x02\xd9\x13\xa1\xea\x8d\x80\xec.\xa8\xb8)\x12\xdb\x0c\xc8n\x81\xaa1\x06\xb2\x1b\x19\xb98A\xe2 \xf5\xb5\x10\xa6\x01\x90Y\rf\x1a\x9a#\x98\x16\b&\xc8\x8cJ\x88Z\x90\x11\xa5\x10Q\x90\xb6\x12\x88(H[1\x84\t\xf2O\xb6\xc0&v\tF\x1e\xa1\a\x8c\xc3\xd9\x8f\x8f\x8d%\x18\x01\xa1\x98\x8d\x97\xea\x01\x00\x00

我在应用中获得的价值包含我不想要的字符-

01010321ea010000645000001f8b0800000000000400e3e6101198c328c1a2c0a8c0a02002c40c1a8c1a0c1a73400418f2081d65e6e6e2e26236303414609498c308619b22b14d80ecc910b68105903d09ca3641625b02d913a1ea8d80ec2ea8b82912db0cc86e81aa3106b21b19b93841e220f5b510a60190590d661a9a2398160826c88c4a885a9011a5105190b6128828485b318409f24fb6c0267609461ea1078cc3d98f8f8d251801a1988d97ea0100000a\n\n"3a1ea8d80ec2ea8b82912db0cc86e81aa3106b21b19b93841e220f5b510a60190590d661a9a2398160826c88c4a885a9011a5105190b6128828485b318409f24fb6c0267609461ea1078cc3d98f8f8d251801a1988d97ea0100000a\n\n"3a1ea8d80ec2ea8b82912db0cc86e81aa3106b21b19b93841e220f5b510a60190590d661a9a2398160826c88c4a885a9011a5105190b6128828485b318409f24fb6c0267609461ea1078cc3d98f8f8d251801a1988d97ea0100000a\n\n

你可以看到\x0101 然后\x0303 然后!21。我想取出第二个字符串中的所有非十六进制值。

  1. 字符是什么样的!和DP。它们是 ASCII 码吗?
  2. 我可以删除像hexString = hexString.Replace("\n", ""); 这样的换行符之类的字符,但我不确定这是否是最好的方法。 3.比较两个字符串,我看到 (=28s@=7340 。是否有用于转换的表格?

【问题讨论】:

  • 第二个字符串中只有十六进制值,即 0-9 a-f 的数字。 dP不是一个字符,是两个字符,翻译成十六进制就是6450! 是一个字符。这似乎是一个 XY 问题 - 你真正想要完成什么?
  • @NetMage 我想删除所有非十六进制的!和 dp 来自第二行的第一个字符串。我只想保留 \x01\x01\x03 之类的东西。
  • 当您说“数据库中的值”时,数据库中的值是否确实包含字符 `, x, 0, 1` - 例如这个值有多长?还有\b\t呢?
  • 我相信当数据库(redis)输出要显示的值时,它会添加\b\n 和任何其他非十六进制的东西。这就是为什么我想摆脱它。这是我执行 GET 命令时数据库中的screenshot

标签: c# parsing hex ascii


【解决方案1】:

我的猜测是数据库将非ASCII(Unicode?)字符显示为十六进制(例如\x03),并且实际字符串包含每个十六进制格式显示的单个字符,其中情况没有区别 - 字符 d 也是十六进制值 \x64,只是数据库选择将可见字符作为正常字母输出 - 与 \t 相同,可以输出为 @ 987654325@ 但他们选择使用 (C) 标准控制字符缩写。

找到这个:

redis-cli 显示在屏幕上时,使用 \xHH 编码格式转义不可打印的字符,其中 HH 是十六进制表示法。

换句话说,

cli 只是使用 3 种不同的方法来显示数据库字段中的值:

  1. 字符可打印,输出字符(例如d、P、!、")。
  2. 字符不可打印,但有C语言标准转义序列,输出转义序列(如\b、\t、\n)。
  3. 字符不可打印且没有转义序列,输出字符值的十六进制(例如\x03、\x01、\x00)。

【讨论】:

  • 对不起,我仍然无法识别哪些字符是实际值,哪些是由 redis-cli 输出的,例如“\n”和“!”我相信它没有存储在 Redis 中。如果我理解正确,我想保留非 ASCII,所以我只使用正则表达式来删除 ASCII 字符?
  • @dqv70219 你错了,所有显示的字符都存储在数据库中。查看我对答案的更新。
猜你喜欢
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 2020-06-11
  • 2020-03-11
  • 2010-12-06
  • 2011-04-06
相关资源
最近更新 更多