我想以编程方式读取二进制文件中的文本/字符串。
我的目标的确切替代方案是stringsLinux 中的shell 命令。
当我运行strings -n 4 /bin/ddshell 命令时,它会打印 818 行文本。
如何像strings命令一样找到二进制中的所有字符串?
我的代码在找到 EOF 后使用read代替fgetc并为其余文本添加了打印块。
它可以在 中找到 813 个单词/bin/dd,但仍然strings可以找到 818 个单词。有什么区别?
另一个问题; 您能建议此代码的性能改进吗?我想read(1)不是最快的方法。
最新更新代码
#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>
#include <fcntl.h>
bool isPrintable(unsigned char c)
{
if(c >= 0x20 && c <= 0x7e || c == 0x09)
{
return true;
}
return false;
}
int main(int argc, char * argv [])
{
char …Run Code Online (Sandbox Code Playgroud) 谁能告诉我如何在python中将浮点数转换为32位二进制字符串以及从32位二进制字符串转换为浮点数?
python 中的“bin”函数仅适用于整数。
我需要一个单比特字符串作为内部表示。我不希望小数位前后的数字有单独的位串,小数位之间由小数位连接。
编辑:标记的问题没有解释如何将二进制字符串转换为浮回。
我正在执行散列操作,我需要一致、准确、高效地附加原始字节等。
我不能乱用 ASCII 编码的数字字符串,我只需要获取原始字节。
MySQL 的转换函数非常混乱,并且不会产生对像我这样的 SQL Server 人员来说显而易见的结果。
例如,BINARY 123456生成 6 个字符的 ASCII 编码字符串,而不是看似明显的BINARY ( 3 )字符串00000001 11100010 01000000aka0x01E240
到目前为止,我可以获得正确转换的唯一方法是分配一个十六进制文字 - 这在运行时显然是不切实际的。
SET @int_value = 123456 ; -- Decimal value
SET @hex_value = 0x01E240 ; -- The same value, in hexadecimal,
-- 6 hex digits = 3 bytes
SELECT LENGTH ( BINARY @int_value ) , LENGTH ( BINARY @hex_value ) , LENGTH ( BINARY HEX ( @int_value ) ) ;
Run Code Online (Sandbox Code Playgroud)
那么在这个例子中,我如何将一个整数值(例如DECLARE …
我有一个解码器函数,它需要一个字节片和 reflect.Kind并返回一个接口和一个错误。接口在代码的其他部分使用时将被断言。有没有办法简化我的 switch 语句,这样我就不必在每种情况下重复 NewReader、Read 和错误处理?
我现在所拥有的:
func decoder(byteValue []byte, t reflect.Kind) (interface{}, error) {
switch t {
case reflect.Int16:
var ret int16
buf := bytes.NewReader(byteValue)
err := binary.Read(buf, binary.BigEndian, &ret)
if err != nil {
return 0, err
}
return ret, nil
case reflect.Int32:
var ret int32
buf := bytes.NewReader(byteValue)
err := binary.Read(buf, binary.BigEndian, &ret)
if err != nil {
return 0, err
}
return ret, nil
}
}
Run Code Online (Sandbox Code Playgroud)
我在找什么:
func decoder(byteValue []byte, t reflect.Kind) (interface{}, error) { …Run Code Online (Sandbox Code Playgroud) 我希望提高我的生物信息学算法的速度,这需要比较“A”、“C”、“G”、“T”之一的字符(例如计算“A”==“C”)
由于字符的大小为 8 位,因此在最坏的情况下需要对二进制数进行 8 次比较。我的猜测是,通过将 'A'、'C'、'G'、'T' 表示为一对二进制数(例如,将 'A' 表示为 make_pair(false,false)),我想我可以提高速度3~4 次,因为它现在最多只需要 2 次二进制比较。
我尝试使用一对布尔值,但速度实际上下降了大约 30%。
表示四个字符和计算相等性的最快方法是什么?内存使用对我来说并不是什么大问题。
供您参考,我使用的是 C++11 编译器。先感谢您。
目前我正在这样做,但问题是我正在遍历数千个这样的字符串(它们都比下面给出的示例字符串长得多)并且当前方法需要很长时间才能完成:
example_string = '1001011101010010101010100100000001111011010101'
reversed = ''
for c in example_string:
if c == '1':
reversed += '0'
elif c == '0':
reversed += '1'
print(reversed)
Run Code Online (Sandbox Code Playgroud) 嗨,我正在处理 c 编程中的按位表示
我打印出来0x15期待0000 1111但得到0001 0101. 这是0x21.
我用这个宏打印出二进制数字
#include <stdio.h>
#define BYTE_TO_BINARY_PATTERN_1BYTE "%c%c%c%c %c%c%c%c"
#define BYTE_TO_BINARY(byte) \
(byte & 0x80 ? '1' : '0'), \
(byte & 0x40 ? '1' : '0'), \
(byte & 0x20 ? '1' : '0'), \
(byte & 0x10 ? '1' : '0'), \
(byte & 0x08 ? '1' : '0'), \
(byte & 0x04 ? '1' : '0'), \
(byte & 0x02 ? '1' : '0'), …Run Code Online (Sandbox Code Playgroud) 据我所知,~0x00 等于:第一步,将 0 更改为 1,将 1 更改为 0,第二步,添加 1 步骤 1:11111111111111111111(计数 =32)
第二步:11111111111111111111111111111+1=0
我哪里做错了?
这是缓冲区溢出的二进制文件的摘录。我用 Ghidra 反编译了它。
char local_7 [32];
long local_78;
printf("Give it a try");
gets(local_7);
if (local_78 != 0x4141414141414141) {
if (local_78 == 0x1122334455667788) {
puts ("That's won")
}
puts("Let's continue");
}
Run Code Online (Sandbox Code Playgroud)
我想了解为什么可能会发生缓冲区溢出。
我检查了“0x4141414141414141”十六进制值,发现它与“A”字符串有关。但是与“0x4141414141414141”和“0x1122334455667788”相关的条件究竟是做什么的?更准确地说,用户可以回答什么来获得消息(“那是赢了”)?
任何解释将不胜感激,谢谢!
___EDIT ___
我必须补充一点,我在使用“disas main”命令时看到了这两个十六进制值:
0x00000000000011a7 <+8>: movabs $0x4141414141414141,%rax
0x00000000000011e6 <+71>: movabs $0x4141414141414141,%rax
0x00000000000011f6 <+87>: movabs $0x1122334455667788,%rax
Run Code Online (Sandbox Code Playgroud)
我尝试使用python3 -c "print ('A' * 32 +'\x88\x77\x66\x55\x44\x33\x22\x11')" | ./ myBinary.
但我总是有"Let's continue"消息。我离解决方案不远了,但我想我错过了一件事..你能帮我什么吗?
___EDIT 2 ___ 在获取之前:
char local_7 [40];
long local_78;
local_78 = 0x4141414141414141;
printf("Give it a …Run Code Online (Sandbox Code Playgroud)